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, ]); } }