new-admin-api/app/common/repositories/system/merchant/MerchantShareholderReposito...

270 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\repositories\system\merchant;
use app\common\dao\system\merchant\MerchantShareholderDao;
use app\common\model\marketing\activity\Activity;
use app\common\model\system\merchant\MerchantShareholder;
use app\common\model\user\ExchangeQuotaRecord;
use app\common\repositories\BaseRepository;
use app\common\repositories\store\coupon\StoreCouponRepository;
use app\common\repositories\store\coupon\StoreCouponUserRepository;
use app\common\repositories\store\order\StoreGroupOrderRepository;
use app\common\repositories\store\order\StoreOrderCreateRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\user\ExchangeQuotaRepository;
use crmeb\services\LockService;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Log;
class MerchantShareholderRepository extends BaseRepository{
public function __construct(MerchantShareholderDao $dao){
$this->dao = $dao;
}
/**
* Common: 公共查询模型
* Author: wu-hui
* Time: 2024/06/13 11:30
* @param $search
* @return \app\common\model\system\merchant\MerchantShareholder
*/
public function getSearchModel($search){
return $this->dao->searchModel($search);
}
/**
* Common: 列表信息获取
* Author: wu-hui
* Time: 2024/06/14 16:00
* @param array $params
* @param int $page
* @param int $limit
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getList(array $params,int $page,int $limit):array{
$query = $this->getSearchModel($params);
$count = $query->count();
$list = $query->page($page,$limit)->select();
return compact('count','list');
}
/**
* Common: 处理加入信息(同步生成订单)
* Author: wu-hui
* Time: 2024/06/14 15:17
* @param $params
* @return mixed
*/
public function handleJoinInfo($params){
return Db::transaction(function() use ($params){
// 等级信息
$levelInfo = app()->make(MerchantShareholderLevelRepository::class)->getSearchModel(['id' => $params['level_id']])->findOrEmpty()->toArray();
$payMoney = $levelInfo['price'] ?? 0;
// 是否已经存在加入信息
$joinInfo = $this->getSearchModel([
'mer_id' => $params['mer_id'],
'level_id' => $params['level_id'],
'uid' => $params['uid'],
])->findOrEmpty()->toArray();
// 支付信息
$payInfo = array_intersect_key($params,array_flip((array)["pay_type","return_url"]));
$payInfo['money'] = (float)$payMoney;
$payResult = [];// 支付信息
$userInfo = $params['user_info'] ?? [];
// 判断: 信息是否已经存在
if($joinInfo){
// 信息已经存在
if((float)$payMoney > 0 && $joinInfo['status'] == 0){
// 需要支付 且未支付
$group_order_id = app()->make(StoreOrderRepository::class)->getSearch(['order_id'=>$joinInfo['order_id']])->value('group_order_id');
$groupOrder = app()->make(StoreGroupOrderRepository::class)->getSearch(['group_order_id'=>$group_order_id])->findOrEmpty();
$payResult = app()
->make(StoreOrderRepository::class)
->pay($payInfo['pay_type'],$userInfo,$groupOrder,$payInfo['return_url'],$params['is_app']);
}
else{
// 无需支付
$this->joinSuccess($joinInfo['id']);
}
}
else{
// 基本信息增加
$merchantShareholderId = $this->createJoinInfo($params);
// 判断:是否需要支付 需要支付生成订单并且获取支付信息
if((float)$payMoney > 0){
// 需要支付 发起支付
$groupOrder = app()
->make(LockService::class)
->exec('online_order.create',function() use ($payInfo,$userInfo){
$payType = array_search($payInfo['pay_type'],StoreOrderRepository::PAY_TYPE);
return app()
->make(StoreOrderCreateRepository::class)
->onlinePayment($payType,$payInfo,$userInfo, 37);
});
// 子订单只存在一个 直接查询即可
$orderId = app()->make(StoreOrderRepository::class)
->getSearch([])
->where('group_order_id',$groupOrder->group_order_id)
->value('order_id');
MerchantShareholder::update(['order_id'=>$orderId],['id'=>$merchantShareholderId]);
// 获取支付信息
$payResult = app()
->make(StoreOrderRepository::class)
->pay($payInfo['pay_type'],$userInfo,$groupOrder,$payInfo['return_url'],$params['is_app']);
}
else{
// 无需支付
$this->joinSuccess($merchantShareholderId);
}
}
return $payResult;
});
}
/**
* Common: 增加加入信息
* Author: wu-hui
* Time: 2024/06/14 13:55
* @param $params
* @return int|string
*/
public function createJoinInfo($params){
// 判断:是否已经存在
$hasId = (int)$this->getSearchModel([
'mer_id' => $params['mer_id'],
'uid' => $params['uid'],
])->value('id');
if($hasId > 0) throw new ValidateException('股东信息已经存在,请勿重复加入!');
// 判断:当前等级是否存在邀请名额限制 存在则判断是否到达限制
$levelQuotaLimit = (int)app()->make(MerchantShareholderLevelRepository::class)->getSearch(['id'=>$params['level_id']])->value('mer_quota');
if($levelQuotaLimit > 0){
$quotaUsed = (int)$this->getSearchModel(['mer_id' => $params['mer_id'],'level_id' => $params['level_id']])->count();
// 等级名额限制 小于等于 已邀请名额;禁止加入
if($levelQuotaLimit <= $quotaUsed) throw new ValidateException('本商户共创股东人数已达到上限,加入失败!');
}
// 不存在 增加
return MerchantShareholder::insertGetId([
'uid' => $params['uid'],
'mer_id' => $params['mer_id'],
'level_id' => $params['level_id'],
]);
}
/**
* Common: 加入成功后处理
* Author: wu-hui
* Time: 2024/06/14 15:17
* @param $id
*/
public function joinSuccess($id){
Db::startTrans();
try{
// 获取记录id
$info = $this->getSearchModel(['id'=>$id])->findOrEmpty()->toArray();
// 等级信息
$levelInfo = app()->make(MerchantShareholderLevelRepository::class)->getSearch(['id'=>$info['level_id']])->findOrEmpty()->toArray();
// 获取活动信息
$couponIds = $levelInfo['coupon_ids'] ? explode(',', $levelInfo['coupon_ids']) : [];
// 判断:是否赠送酒卡额度
if($levelInfo['quota'] > 0) $this->giveQuota((float)$levelInfo['quota'], (int)1, (int)$info['uid'], (int)$info['order_id']);
// 判断:是否赠送菜卡额度
if($levelInfo['vegetable_quota'] > 0) $this->giveQuota((float)$levelInfo['vegetable_quota'], (int)2, (int)$info['uid'], (int)$info['order_id']);
// 判断:是否赠送油卡额度
if($levelInfo['oil_quota'] > 0) $this->giveQuota((float)$levelInfo['oil_quota'], (int)3, (int)$info['uid'], (int)$info['order_id']);
// 判断:是否赠送封坛酒卡额度
if($levelInfo['wine_quota'] > 0) $this->giveQuota((float)$levelInfo['wine_quota'], (int)4, (int)$info['uid'], (int)$info['order_id']);
// 是否赠送优惠券
if(count($couponIds) > 0){
$uid = $info['uid'];
foreach($couponIds as $coupon_id){
$coupon = app()->make(StoreCouponRepository::class)->validSvipCouponTwo($coupon_id,$uid);
if (!$coupon) continue;//throw new ValidateException('优惠券失效');
// 获取商户id 和关联的品牌ID
$bindShop = [];
if((int)$info['mer_id'] > 0){
$bindShop = app()->make(MerchantRepository::class)->getSearch([])
->where('mer_id', $info['mer_id'])
->where('is_del', 0)
->findOrEmpty()
->toArray();
}
$params = [
'shop_mer_id' => $bindShop['mer_id'] ?? 0,
'brand_id' => $bindShop['brand_id'] ?? 0,
'user_order_id' => $info['order_id'] ?? 0,
];
app()->make(StoreCouponRepository::class)->sendCoupon($coupon, $uid,StoreCouponUserRepository::SEND_TYPE_BUY, $params);
}
}
// 修改信息
MerchantShareholder::update([
'price' => $levelInfo['price'],
'quota' => $levelInfo['quota'],
'vegetable_quota' => $levelInfo['vegetable_quota'],
'oil_quota' => $levelInfo['oil_quota'],
'wine_quota' => $levelInfo['wine_quota'],
'coupon_ids' => $levelInfo['coupon_ids'],
'status' => 1,
],['id' => $id]);
Db::commit();
}catch(\Exception $e){
Db::rollback();
Log::info('支付成功处理加入成功后的信息 - 错误: '.var_export([
'id' => $id,
'msg' => $e->getMessage()
],1));
}
}
/**
* Common: 各种额度变更(赠送变更)
* Author: wu-hui
* Time: 2024/06/14 15:07
* @param float $num 变更数量
* @param int $quotaType 1=酒卡额度2=菜卡额度3=封坛酒额度4=加油卡额度
* @param int $uid 用户id
* @param int $orderId 订单id
*/
public function giveQuota(float $num,int $quotaType,int $uid,int $orderId){
$holdInfo = app()->make(ExchangeQuotaRepository::class)->searchModel(['uid'=>$uid,'quota_type'=>$quotaType])->findOrEmpty();
if((int)$holdInfo->uid <= 0) {
$holdInfo->uid = $uid;
$holdInfo->quota_type = $quotaType;
}
// 赠送
$changeFront = (float)$holdInfo->surplus_quota;
$holdInfo->total_quota += (float)$num;// 总额度
$holdInfo->surplus_quota += (float)$num;// 剩余额度
$holdInfo->save();
// 记录
ExchangeQuotaRecord::insert([
'uid' => $uid,
'product_id' => 0,
'order_id' => $orderId,
'order_product_id' => 0,
'change_type' => 1,
'change_quantity' => (float)$num,
'change_front' => $changeFront,
'change_after' => (float)$holdInfo->surplus_quota,
'remark' => "参加活动赠送",
'source' => 5,
'quota_type' => $quotaType,
]);
}
}