id); DB::beginTransaction(); try{ // 当前订单全部商品 $goodsList = $this->getGoodsList($model->id); // 获取当前用户及上级信息 $agents = $this->getParent($model->uid);// 全部上级信息(包含购买人) // 循环处理每个商品 $changeRecord = [];// 变更记录 foreach($goodsList as $goodsInfo){ // 由于涉及到删除 使用的经销商列表重新赋值给新的变量 方便操作 $useAgentList = $agents; // 判断:赠送等级为二级时,删除第三个用户 赠送等级:0=二级,1=三级 if($goodsInfo['lv_type'] == 1 && count($useAgentList) >= 3) unset($useAgentList[2]); // 循环上级信息 处理每一个用户、每一个商品的赠送情况 foreach($useAgentList as $agentKey => $agentInfo){ // 用户当前的权重值 $currentAgentHasWeightValue = (float)$agents[$agentKey]['weight_value']['quantity'] ?? 0; // 符合条件 获取当前用户应得的权重值 $weightValue = $this->getWeightValue($goodsInfo,$agentInfo);// 应得权重值 $totalWeightValue = (float)sprintf("%.2f",$goodsInfo['total'] * $weightValue);// 总数量 * 应得权重值 = 总应得权重值 // 应得权重值大于0 记录改变信息并且修改持有权重值 if((float)$totalWeightValue > 0){ $changeAfter = sprintf("%.2f",($currentAgentHasWeightValue + $totalWeightValue)); $changeRecord[] = [ 'uniacid' => $model->uniacid, 'member_id' => $agentInfo['uid'],// 用户id 'team_dividend_agency_level_id' => $agentInfo['team_dividend_agency_level_id'],// 经销商等级id 'goods_id' => $goodsInfo['goods_id'],// 商品id 'order_id' => $model->id,// 订单id 'order_goods_id' => $goodsInfo['id'],// 订单商品id 'change_type' => 1,// 变更类型:0=减少,1=增加 'change_quantity' => $totalWeightValue,// 变更数量 'change_front' => (float)$currentAgentHasWeightValue,// 变更前拥有的数量 'change_after' => $changeAfter,// 变更后拥有的数量 'remark' => "订单{$model->order_sn}赠送",// 备注 'created_at' => time(),// 变更时间 ]; $agents[$agentKey]['weight_value']['quantity'] = $changeAfter; } } } // 修改用户权重值变更信息 | 处理权重值变更记录 if($changeRecord){ $updateWeightValueList = array_column($agents,'weight_value'); self::updateInfo($updateWeightValueList); WeightValueLog::insert($changeRecord); } DB::commit(); }catch(\Exception $e){ \Log::debug('------购买商品赠送权重值 - 错误抛出------',$e->getMessage()); DB::rollBack(); } return; } /** * Common: 购买商品赠送权重值 - 获取相关商品列表 * Author: wu-hui * Time: 2023/10/12 11:26 * @param $orderId * @return array */ private function getGoodsList($orderId){ $list = OrderGoods::uniacid() ->join('yz_goods_weight_value', 'yz_goods_weight_value.goods_id', 'yz_order_goods.goods_id') ->where('yz_order_goods.order_id',$orderId) ->where('yz_goods_weight_value.is_open',1) ->select([ 'yz_order_goods.id', 'yz_order_goods.goods_id', 'yz_order_goods.total', 'yz_order_goods.title', 'yz_goods_weight_value.is_open', 'yz_goods_weight_value.gift_type', 'yz_goods_weight_value.lv_type', 'yz_goods_weight_value.quantity', 'yz_goods_weight_value.ladder' ]) ->get() ->makeHidden(['order','after_sales','buttons']); return $list ? $list->toArray() : []; } /** * Common: 购买商品赠送权重值 - 获取上级信息 * Author: wu-hui * Time: 2023/10/12 11:06 * @param $uid * @return array */ private function getParent($uid){ // 获取上级信息 $parents = MemberParent::uniacid() ->where('member_id', $uid) ->select(['parent_id','level']) ->orderBy('level', 'asc') ->limit(2)// 由于最多只分三层,这里只获取直推上级及其上级 ->get() ->toArray(); // 包含购买人 $parents = array_merge([['parent_id' => $uid,'level' => 0]],$parents); $uidS = array_column($parents,'parent_id'); // 获取经销商信息 $teamDividend = TeamDividendAgencyModel::uniacid() ->select(['uid','level','is_black']) ->whereIn('uid',$uidS) ->get(); $teamDividend = $teamDividend ? $teamDividend->keyBy('uid')->toArray() : []; // 获取相关用户的权重值信息 $weightValueList = WeightValue::uniacid() ->select(['id','member_id','team_dividend_agency_level_id','quantity']) ->whereIn('member_id',(array)$uidS) ->get() ->toArray(); $weightValueGroup = []; foreach($weightValueList as $weightValueItem){ $weightValueGroup[$weightValueItem['member_id']][$weightValueItem['team_dividend_agency_level_id']] = $weightValueItem; } // 获取全部经销商 以此来获取排名信息 $allTeamDividend = TeamDividendAgencyModel::uniacid()->pluck('uid')->toArray(); $allTeamDividend = array_flip($allTeamDividend); $agents = []; foreach($parents as $memberInfo){ $teamDividendInfo = $teamDividend[$memberInfo['parent_id']] ?? []; // 判断:仅经销商 且 不是黑名单的用户才会赠送 $isBlack = (int)$teamDividendInfo['is_black'] ?? 0;// 是否为黑名单 if($teamDividendInfo && $isBlack != 1) { $teamDividendInfo['ranking'] = ((int)$allTeamDividend[$memberInfo['parent_id']] + 1); $weightValue = $weightValueGroup[$memberInfo['parent_id']][(int)$teamDividendInfo['level']] ?? [ 'uniacid' => \YunShop::app()->uniacid, 'member_id' => $memberInfo['parent_id'], 'team_dividend_agency_level_id' => (int)$teamDividendInfo['level'], 'quantity' => 0, ]; $agents[] = [ 'uid' => $memberInfo['parent_id'], 'level' => $memberInfo['level'], 'team_dividend_agency_level_id' => (int)$teamDividendInfo['level'], 'weight_value' => $weightValue, 'teamDividend' => $teamDividendInfo ]; } } return $agents; } /** * Common: 购买商品赠送权重值 - 获取应得权重值 * Author: wu-hui * Time: 2023/10/12 14:03 * @param $currentSale * @param $agentInfo * @return float|int */ private function getWeightValue($currentSale,$agentInfo){ if((int)$currentSale['gift_type'] == 0){ // 赠送固定值 return $currentSale['quantity']; }else if($agentInfo['teamDividend']){ // 阶梯赠送 阶梯判断条件必须按照从大到小排序 $ladderList = json_decode($currentSale['ladder'],true); array_multisort(array_column($ladderList,'where'),SORT_ASC, $ladderList); $ranking = (int)$agentInfo['teamDividend']['ranking']; $weightValueNum = 0; foreach($ladderList as $ladder){ if($ranking <= $ladder['where'] && $ranking > 0){ $weightValueNum = (float)$ladder['num']; break; } } return $weightValueNum; }else { return (float)0; } } /** * Common: 修改信息 * 必须是包含member_id、team_dividend_agency_level_id、quantity的二维数组 * Author: wu-hui * Time: 2023/10/12 15:09 * @param $updateWeightValueList */ public static function updateInfo($updateWeightValueList){ // 判断:是否为二维数组 if(!is_array($updateWeightValueList[0])) $updateWeightValueList = [$updateWeightValueList]; // 循环处理 存在修改,不存在添加 foreach($updateWeightValueList as $wv){ $weightValueModel = self::uniacid() ->where('member_id',$wv['member_id']) ->where('team_dividend_agency_level_id',$wv['team_dividend_agency_level_id']) ->first(); if(!$weightValueModel) $weightValueModel = new static(); // 修改赋值 if((int)$weightValueModel->id <= 0){ $weightValueModel->uniacid = \YunShop::app()->uniacid; $weightValueModel->member_id = $wv['member_id']; $weightValueModel->team_dividend_agency_level_id = $wv['team_dividend_agency_level_id']; } $weightValueModel->quantity = (float)$wv['quantity']; $weightValueModel->save(); } } }