| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- <?php
- namespace common\logic\order\marketing;
- use addons\Agent\common\enums\ComputingEnum;
- use addons\Agent\common\logic\reward\AgentReward;
- use addons\Agent\common\models\Agent;
- use addons\Agent\common\models\AgentCommissionItemSetting;
- use addons\Agent\common\models\AgentLevel;
- use addons\Mch\common\models\MchGoodsModel;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\models\mall\MallAddons;
- use Exception;
- use phpDocumentor\Reflection\Types\Self_;
- use yii\helpers\Json;
- /**
- * Class AgentMarketing
- * @Author: hua
- * @DateTime: 2022/1/14 17:22
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package common\logic\order\marketing渠道分红
- */
- class AgentMarketing extends BaseMarketing
- {
- public function execute($form)
- {
- }
- public static function compute($item, &$form, &$extra)
- {
- try {
- $group_order_goods = $form['group_order_goods'];
- $mall_id = $form['mall_id'];
- if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT)) return $item;
- $setting = \Yii::$app->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;
- }
- }
|