services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_AGENT, 'basic'); $user_id = $form->user->id; $agent = Agent::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if (empty($agent)) return $item; //是否安装渠道业绩插件 $is_install_agent_base = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT_BASE); $goods_deduct = \Yii::$app->services->setting->mall->get($mall_id, 'order.goods_deduct'); //如果安装了渠道业绩插件,并且订单设置-抵扣设置-内购抵扣选择agent_base,则进行抵扣 // if ($is_install_agent_base && $goods_deduct == 'agent_base') return $item; if (empty($setting['is_self_buy']) || empty($setting['enable_goods_deduct'])) return $item; $name = 'commission'; $commission_level_setting = self::getCommissionLevelSetting($mall_id, $agent->level, $name); $commission_agent_goods_setting = self::getAgentGoodsSetting($mall_id,$item['goods'], $name, $agent->level); $name = 'score'; $score_level_setting = self::getCommissionLevelSetting($mall_id, $agent->level, $name); $score_agent_goods_setting = self::getAgentGoodsSetting($mall_id,$item['goods'], $name, $agent->level); $deduct_setting = \Yii::$app->services->setting->mall->get($mall_id, 'score'); $total_deduct_goods_price = 0; if (empty($extra['total_deduct_money'])) { $total_deduct_money = 0; $extra['total_deduct_money'] = $total_deduct_money; } else { $total_deduct_money = $extra['total_deduct_money']; } $extraAgentMarketingAddons = $form['process_extra_data']['extra_agent_marketing_addons'] ?? []; $agent_deduct = []; // 获取多商户商品是否走商品抵扣配置 $mchEnableGoodsDeduct = false; $isInstallMch = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_MCH); if ($isInstallMch) { // 获取配置 $mchEnableGoodsDeduct = !empty(\Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_MCH, 'mode.enable_agent_goods_deduct')); } foreach ($item['goods'] as &$row) { foreach ($row['goods_details'] as &$v) { $isMch = false; if (!empty($v['mch_id'])) { if (is_numeric($v['mch_id']) && $isInstallMch) { if (!$mchEnableGoodsDeduct || !MchGoodsModel::isParticipateAgent($mall_id, $v['mch_id'], $v['goods_id'])) { continue; } $isMch = true; } elseif(!in_array($v['mch_id'], array_merge($extraAgentMarketingAddons, ['StarChain']))) { continue; } } if (!$isMch) { // 检测商品是否参与了渠道分红 $item_setting = AgentCommissionItemSetting::find()->select('item_id,is_participate,is_self_buy_alone,is_self_buy,enable_goods_deduct')->where(['item_id' => $row['goods_id'], 'status' => StatusEnum::ENABLED])->asArray()->one(); if (!empty($item_setting) && empty($item_setting['is_participate'])) continue; //独立设置内购 if(!empty($item_setting['is_self_buy_alone'])){ if (empty($item_setting['is_self_buy']) || empty($item_setting['enable_goods_deduct'])) continue; } } $multiple= $v['num']; if(!isset($v['marketing']['agent_deduct'])) $v['marketing']['agent_deduct']= 0; // 多商户 if ($isMch) { $agent_reward_obj = new \addons\Mch\common\logic\addons\Agent\AgentReward($mall_id, $user_id, $setting, [$agent], $setting['is_self_buy']); $agent_reward_obj->order_detail = $v; $temp_commission_level_setting = $agent_reward_obj->getLevelConfig()[$agent->level] ?? []; } else { $temp_commission_level_setting = $commission_level_setting; // liuzhantao注释:下面三行代码,原本这个是写在上面(循环外),但获取不了商品详情,以致于执行getRules()时,获取不了商品详情数据 // 所以写在这里,用$v导入$agent_reward_obj->order_detail里,执行getRules(),就能获取商品详情数据了 // 并且,将 $rules['money'] 代替 $v['price'] $agent_reward_obj = new AgentReward($mall_id, $user_id, $setting, [$agent], $setting['is_self_buy']); $agent_reward_obj->order_detail = $v; if (isset($commission_agent_goods_setting[$v['goods_id']])) $temp_commission_level_setting = $commission_agent_goods_setting[$v['goods_id']]; } $rules = $agent_reward_obj->getRules(); $team_prize = $agent_reward_obj->computing($temp_commission_level_setting, $rules['money'], ComputingEnum::TEAM_PRIZE, $multiple); $team_prize = bcadd(0, $team_prize, 2); $total_deduct_money_temp = 0; if ($team_prize > 0){ $agent_deduct['commission'] = $team_prize; if($team_prize>$v['goods_price']) $team_prize = $v['goods_price']; $total_deduct_money += $team_prize; $total_deduct_goods_price += $team_prize; $total_deduct_money_temp += $team_prize; $v['goods_price'] -= $team_prize; $v['marketing']['agent_deduct'] += $team_prize; $v['marketing']['pay_money'] = $v['goods_price']; } $deduct_money = 0; if ($deduct_setting['score_deduct_status'] == 1) { if ($isMch) { $agent_reward_obj->name = 'score'; $temp_score_level_setting = $agent_reward_obj->getLevelConfig()[$agent->level] ?? []; } else { $temp_score_level_setting = $score_level_setting; if (isset($score_agent_goods_setting[$v['goods_id']])) $temp_score_level_setting = $score_agent_goods_setting[$v['goods_id']]; } $team_prize_score = $agent_reward_obj->computing($temp_score_level_setting, $rules['money'], ComputingEnum::TEAM_PRIZE, $multiple); $team_prize_score = bcadd(0, $team_prize_score, 2); if($team_prize_score>0){ $agent_deduct['score'] = $team_prize_score; $goods_extra = $form->sku[$v['goods_id']]['goods']['extra']; if(!empty($deduct_setting['score_deduct_ratio'])){ $deduct_money = bcdiv($team_prize_score, $deduct_setting['score_deduct_ratio'], 2); } if($deduct_money>0){ if($deduct_money>$v['goods_price']) $deduct_money = $v['goods_price']; $total_deduct_money += $deduct_money; $total_deduct_goods_price += $deduct_money; $total_deduct_money_temp += $deduct_money; $v['goods_price'] -= $deduct_money; $v['marketing']['agent_deduct'] += $deduct_money; $v['marketing']['pay_money'] = $v['goods_price']; } } } $v['marketing']['agent_extra'] = json_encode($agent_deduct); $row['goods_price'] -= bcadd(0, $total_deduct_money_temp, 2); } } $total_deduct_money = bcadd(0, $total_deduct_money, 2); $item['mch_order_info'] = $item['mch_order_info'] ?? []; $item['mch_order_info']['goods_price'] = $item['mch_order_info']['goods_price'] ?? 0; $item['mch_order_info']['goods_price'] -= $total_deduct_money; $form['group_order_goods'] = $group_order_goods; $form['total_pay_money'] -= $total_deduct_money; if (!empty($total_deduct_money) && $total_deduct_money > 0) $form->marketing['deduct']['agent_deduct'] = [ 'name' => '经销商内购商品抵扣', 'money' => -floor($total_deduct_money * 100) / 100, 'agent_deduct'=>json_encode($agent_deduct) ]; return $item; } catch (Exception $e) { self::setStaticError('经销商内购商品抵扣计算错误:' . $e->getMessage()); return false; } } public static function getCommissionLevelSetting($mall_id, $agent_level, $name) { $agent_level_arr = AgentLevel::getOne([['mall_id' => $mall_id], ['level' => $agent_level], ['status' => StatusEnum::ENABLED]], true, ['commissionLevelSetting' => function ($query) use ($name,$mall_id,$agent_level) { $query->where(['commission_type' => $name])->andWhere(['mall_id'=>$mall_id,'level'=>$agent_level,'status' => StatusEnum::ENABLED])->select('id,mall_id,level,commission_type,from_type,is_percent_team,is_percent_equal, is_percent_over,is_percent_extra,agent_team_prize,agent_equal_prize,agent_over_prize,agent_extra_prize,status'); }]); return $agent_level_arr['commissionLevelSetting']; } public static function getAgentGoodsSetting($mall_id,$goods, $name, $agent_level) { $goods_ids = array_column($goods, 'goods_id'); $where = [['item_id' => $goods_ids, 'item_type' => 'goods', 'commission_type' => $name, 'status' => StatusEnum::ENABLED]]; $select = 'id,mall_id,is_participate,is_enable,item_id,item_type,commission_type,is_percent_team,is_percent_equal,is_percent_over,is_percent_extra,status'; $with = ['detail' => function ($query) use($agent_level,$mall_id){ $query->where(['level'=>$agent_level,'mall_id'=>$mall_id,'status' => StatusEnum::ENABLED])->select('id,mall_id,agent_commission_item_setting_id,level,agent_team_prize,agent_equal_prize,agent_over_prize,agent_extra_prize,status'); }]; $agent_goods_setting_list = AgentCommissionItemSetting::lists(['where' => $where, 'with' => $with, 'select' => $select]); $setting_arr = []; if (!empty($agent_goods_setting_list)) { foreach ($agent_goods_setting_list as $agent_goods_setting) { if ($agent_goods_setting['commission_type'] == $name && $agent_goods_setting['is_enable']) { foreach ($agent_goods_setting['detail'] as $val) { if ($val['level'] == $agent_level) { $setting_arr[$agent_goods_setting['item_id']] = [ 'is_percent_team' => $agent_goods_setting['is_percent_team'], 'is_percent_equal' => $agent_goods_setting['is_percent_equal'], 'is_percent_over' => $agent_goods_setting['is_percent_over'], 'is_percent_extra' => $agent_goods_setting['is_percent_extra'], 'agent_team_prize' => $val['agent_team_prize'], 'agent_equal_prize' => $val['agent_equal_prize'], 'agent_over_prize' => $val['agent_over_prize'], 'agent_extra_prize' => $val['agent_extra_prize'], ]; } } } } } return $setting_arr; } public static function scoreProcessing($detail, $use_score, $goods_info) { $exc_money = 0; //获取积分商品抵扣比例 $deduct_setting = \Yii::$app->services->setting->mall->get($detail['mall_id'], 'score'); if ($deduct_setting['score_deduct_status'] == 1) { if ($goods_info) { if ($goods_info['score_deduct_setting']) { $setting = Json::decode($goods_info['score_deduct_setting']); //抵扣 if ($setting['deduct_num'] > 0) { //1.单件抵扣 2.多件累计抵扣 //单件抵扣,指该抵扣值可抵扣订单该商品1件,抵扣值如果大于商品售价则按商品售价计算 //多件累计抵扣,指该抵扣值可抵扣订单内所有该商品,每件商品分摊此抵扣值 if ($setting['deduct_type'] == 1) { //最大抵扣金额 $max = bcdiv($detail['price'], $detail['num'], 2) > $setting['deduct_num'] ? $setting['deduct_num'] : bcdiv($detail['price'], $detail['num'], 2); } else { $max = $detail['price'] > $setting['deduct_num'] ? $setting['deduct_num'] : $detail['price']; } !empty($deduct_setting['score_deduct_ratio']) && $exc_money = bcdiv($use_score, $deduct_setting['score_deduct_ratio'], 2); if ($exc_money > 0) { if ($exc_money > $max) { $exc_money = $max; } } } } } } return $exc_money; } public static function getDeductMoney($mall_id,$user_id,$goods_attr_id_arr){ $attr_id_arr = []; foreach ($goods_attr_id_arr as $goods_attr_id=>$num){ $attr_id_arr[]=$goods_attr_id; } $params['where'] = [['=','status',StatusEnum::ENABLED],['id'=>$attr_id_arr]]; $params['with'] = ['goods','goods.extra']; $sku_arr = \common\models\goods\GoodsAttr::lists($params,true); $order_goods_arr = []; foreach ($sku_arr as $sku){ $buy_num = $goods_attr_id_arr[$sku['id']]; $order_goods = new \common\models\order\OrderDetail(); $order_goods = $order_goods->loadDefaultValues(); $order_goods->goods_id = $sku['goods_id']; $order_goods->goods_name = $sku['goods']['goods_name']; $order_goods->goods_attr_id = $sku['id']; $order_goods->sign_id = $sku['sign_id']; $order_goods->goods_attr_name = $sku['name']; $order_goods->num = $buy_num; $order_goods->cost_price = $sku['cost_price']; $order_goods->price = $sku['price']; $order_goods->goods_price = bcmul($order_goods->num, $order_goods->price,2); $order_goods->original_goods_price = $order_goods->goods_price; $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic']; $order_goods->user_id =$user_id; $order_goods->mch_id = $sku['goods']['mch_id']; $order_goods->mall_id = $mall_id; // 默认数据带下单数量方便计算 $goods = $sku['goods']; $goods['number'] = $buy_num; $order_goods_arr[] = \common\helpers\ArrayHelper::toArray($order_goods); } // 产品按照商户重新归类组别 $group_order_goods = []; foreach ($order_goods_arr as $item) { if (!isset($group_order_goods[$item['mch_id']]['goods'][$item['goods_id']])) { $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_id'] = $item['goods_id']; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] = 0; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] = 0; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_name'] = $item['goods_name']; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'] = []; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] = 0; } $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] += $item['goods_price']; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] += $item['original_goods_price']; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] += $item['num']; $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'][] = $item; } $orderFormLogic = new \common\logic\order\OrderFormLogic(); $form = $orderFormLogic->getDefaultform($mall_id, $user_id); $form->group_order_goods = $group_order_goods; $user = \common\models\user\User::getOne([['id'=>$user_id,'mall_id'=>$mall_id]]); $form->user = $user; $result = []; foreach ($group_order_goods as &$item) { $item = self::compute($item,$form,$extra); foreach ($item['goods'] ?? [] as $goods_id=>$val){ foreach ($val['goods_details'] as $row){ $row['marketing'] = $row['marketing'] ?? []; $row['marketing']['pay_money'] = $row['marketing']['pay_money'] ?? 0; $result[$row['goods_attr_id']] = $row['marketing']['pay_money']; } } } return $result; } }