$this->mall_id], ['status' => StatusEnum::ENABLED]]; $mall_id = $this->mall_id; $name = $this->name; $params['with'] = ['commissionLevelSetting' => function ($query) use ($name, $mall_id) { $query->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'commission_type' => $name,]); }]; $distribution_level_list = DistributionLevel::lists($params); $config_arr = []; //默认等级 if (isset($this->basic_conf[$name])) { $basic_conf = json_decode($this->basic_conf[$name], true); $basic_conf['mall_id'] = $this->mall_id; $basic_conf['level'] = 0; $basic_conf['commission_type'] = $name; $basic_conf['status'] = StatusEnum::ENABLED; $config_arr[0] = $basic_conf; } foreach ($distribution_level_list as $item) { $config_arr[$item['level']] = $item['commissionLevelSetting']; } $this->level_config = $config_arr; $where = [['item_id' => $this->order_detail['goods_id']], ['mall_id' => $mall_id], ['item_type' => 'goods'], ['commission_type' => $name], ['status' => StatusEnum::ENABLED]]; $distribution_goods_setting = DistributionCommissionItemSetting::getOne($where, true, ['detail']); $this->distribution_goods_setting = $distribution_goods_setting; $keysToKeep = array_keys($config_arr); if (!empty($distribution_goods_setting)) { if ($distribution_goods_setting['commission_type'] == $name && $distribution_goods_setting['is_enable']) { $config_arr = []; // 原本没有筛选,就算等级不启用,只要商品设置了奖励,照样有佣金 // 现在加了筛选,等级不启用,就会跳过,商品设置了奖励,也不会有佣金 foreach ($distribution_goods_setting['detail'] as $k => $val) { if(!in_array($k, $keysToKeep)){ continue; } $config_arr[$val['level']] = [ 'is_percent' => $distribution_goods_setting['is_percent'], 'first_prize' => $val['first_prize'], 'second_prize' => $val['second_prize'], 'third_prize' => $val['third_prize'], ]; } $this->goods_config = $config_arr; } if($distribution_goods_setting['commission_type'] == 'commission' && $distribution_goods_setting['is_enable_regular_bonus'] == StatusEnum::ENABLED){ if(class_exists($this->regular_bonus_handle_class)){ $this->regular_bonus_handle_instance = new $this->regular_bonus_handle_class; $this->is_enable_regular_bonus = $this->regular_bonus_handle_instance->getAgentOrDistributionStatus($mall_id, DistributionEnum::ADDONS_NAME); if($this->is_enable_regular_bonus && !empty($distribution_goods_setting['extra'])){ $extra = json_decode($distribution_goods_setting['extra'], true); $regular_bonus_setting = $extra['RegularBonus'] ?? []; $regular_bonus_setting = $regular_bonus_setting['commission'] ?? []; $regular_goods_setting = $regular_bonus_setting; if(!empty($regular_bonus_setting)){ $regular_goods_setting = []; foreach($regular_bonus_setting['detail'] as $value){ $regular_goods_setting[$value['level']] = [ 'is_percent' => $regular_bonus_setting['is_percent'], 'first_prize' => $value['first_prize'], 'second_prize' => $value['second_prize'], 'third_prize' => $value['third_prize'], ]; } } $this->regular_bonus_goods_setting = $regular_goods_setting; } } } } return $config_arr; } /** * @desc:奖励规则 * @Author: hua * @Date: 2021/10/28 * @Time: 16:08 * @Copyright: copyright (c) 2021 广东七件事集团 * @return array */ public function getRules($source_table) { //0实际支付金额1商品售价2商品利润 $multiple = $this->order_detail['num'] ?? 1; $money = $this->order_detail['goods_price']; switch ($this->basic_conf['computing_method']) { case ComputingEnum::COMPUTING_METHOD_PAY_PRICE: $adjust_money = $this->order_detail['adjust_money'] ?? 0; $money = ($this->order_detail['goods_price'] + $adjust_money) / $multiple; break; case ComputingEnum::COMPUTING_METHOD_GOODS_PRICE: $money = $this->order_detail['original_goods_price'] / $multiple; break; case ComputingEnum::COMPUTING_METHOD_GOODS_PROFIT: $goods_price = $this->order_detail['goods_price'] ?? 0; $cost_price = $this->order_detail['cost_price'] ?? 0; $adjust_money = $this->order_detail['adjust_money'] ?? 0; $money = ($goods_price / $multiple) - $cost_price + $adjust_money/$multiple; if ($money < 0) $money = 0; break; } $extension = ['source_table' => 'order_detail', 'source_table_id' => $this->order_detail['id'], 'from_type' => DistributionEnum::ADDONS_NAME]; if(!isset($this->extension)) $this->extension = $extension; return ['money' => $money, 'multiple' => $multiple, 'extension' => $this->extension]; } /** * @desc:记录每次触发奖励的相关配置 * @Author: hua * @Date: 2021/11/18 * @Time: 11:09 * @Copyright: copyright (c) 2021 广东七件事集团 */ public function addRewardConfigLog() { $extension = $this->extension; $add_data['source_table'] = $extension['source_table']; $add_data['source_table_id'] = $extension['source_table_id']; $add_data['type'] = $this->name; $add_data['from_type'] = $extension['from_type']; $add_data['basic_config'] = !empty($this->basic_conf) ? json_encode($this->basic_conf) : ''; $add_data['level_config'] = !empty($this->level_config) ? json_encode($this->level_config) : ''; if (!empty($this->goods_config)) $add_data['goods_config'] = json_encode($this->goods_config); $distribution_arr = []; foreach ($this->distribution_list as $agent) { $distribution_arr[$agent['id']] = [ 'user_id' => $agent['user_id'], 'level' => $agent['level'], ]; } $add_data['relation_ship'] = !empty($distribution_arr) ? json_encode($distribution_arr) : ''; $add_data['mall_id'] = $this->mall_id; $add_data['status'] = StatusEnum::ENABLED; $res = DistributionCommissionBasisLog::setData($add_data); if ($res == false) echo 'DistributionReward:addRewardConfigLog:err:' . DistributionCommissionBasisLog::getStaticError(); } /** * @desc:组装插入数据 * @Author: hua * @Date: 2021/10/28 * @Time: 16:34 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $prize_list * @param $extension * @return array */ public function packagingData($prize_list, $extension) { //投递到资产队列 $state = ComputingEnum::DISTRIBUTION_FROZEN; if ($this->basic_conf['compute_type'] == ComputingEnum::ORDER_PAY) $state = ComputingEnum::DISTRIBUTION_FROZEN; $insert_wallet = []; $is_frozen = true; $goods_id = $this->order_detail['goods_id']; $goods = Goods::findOne(['id' => $goods_id]); if ($goods['goods_type'] == GoodsTypeEnum::GoodsTypeVirtual) { //虚拟商品,支付后-直接订单完成,所以直接结算 $is_frozen = false; } else { if ($this->basic_conf['compute_type'] == ComputingEnum::ORDER_PAY) $is_frozen = false; if ($this->basic_conf['compute_type'] == ComputingEnum::ORDER_FINISH) $is_frozen = true; } $from_type = $extension['from_type'] ?? DistributionEnum::ADDONS_NAME; $user_wallet = []; $is_decr_score = $this->basic_conf['is_decr_score'] ?? 0; $decr_score_sign = $is_decr_score && $this->name == 'commission'; if ($decr_score_sign) { $user_wallet = UserWallet::lists([ 'where' => [['user_id' => array_keys($prize_list)], ['mall_id' => $this->mall_id]], 'select' => 'user_id, score', 'index' => 'user_id' ], true); } $height_commission_arr = []; foreach ($prize_list as $user_id => $item) { //判断是否设置最高佣金奖励 if($this->name == 'commission'){ $distribution = Distribution::findOne(['user_id'=>$user_id,'status'=>[StatusEnum::ENABLED,StatusEnum::DISABLED],'mall_id'=>$this->mall_id]); if($distribution && !empty($distribution['is_height_commission'])){ $can_reward_amount = $distribution['height_commission'] - $distribution['total_commission']; if(isset($height_commission_arr[$user_id]['amount'])){ $can_reward_amount -= $height_commission_arr[$user_id]['amount']; } if($can_reward_amount <= 0){ $item['price'] = 0; $prize_list[$user_id]['price'] = 0; }elseif($can_reward_amount < $item['price']){ $item['price'] = $can_reward_amount; $prize_list[$user_id]['price'] = $can_reward_amount; if(isset($height_commission_arr[$user_id]['amount'])){ $height_commission_arr[$user_id]['amount'] += $can_reward_amount; }else{ $height_commission_arr[$user_id]['amount'] = $can_reward_amount; } } } } if ($decr_score_sign) { $user_score = isset($user_wallet[$user_id]) ? $user_wallet[$user_id]['score'] : 0; $item['price'] = $user_score >= $item['price'] ? $item['price'] : $user_score; } $item['price'] = bcmul($item['price'], 1, 2); if ($item['price'] <= 0) continue; $prize_name = self::PRICE_NAME_MAP[$item['deep']] ?? '未知资金类型'; $desc = '用户(' . $user_id . '),获得订单(' . $this->order_detail['order_id'] . ')分销商奖励,奖励类型:' . $prize_name . ',金额:' . $item['price']; // echo $desc.PHP_EOL; $insert_wallet[] = [ 'mall_id' => $this->mall_id, 'user_id' => $user_id, 'is_frozen' => $is_frozen, 'wallet_type' => $this->name, 'money' => $item['price'], 'desc' => $desc, 'source_table' => $extension['source_table'] ?? '', 'source_table_id' => $extension['source_table_id'] ?? '', 'from_type' => $from_type, 'capital_type' => $item['deep'], 'order_no' => $this->order_detail['order_no'], 'contributor_name' => $this->order_detail['goods_name'], 'contributor_id' => $this->user_id, 'contributor_money' => $this->order_detail['goods_price'], ]; if ($decr_score_sign) { $desc = '用户(' . $user_id . '),获得订单(' . $this->order_detail['order_id'] . ')分销商奖励,奖励类型:' . $prize_name . ',扣除积分:' . $item['price']; $insert_wallet[] = [ 'mall_id' => $this->mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'wallet_type' => 'score', 'money' => bcmul($item['price'], -1, 2), 'desc' => $desc, 'source_table' => $extension['source_table'] ?? '', 'source_table_id' => $extension['source_table_id'] ?? '', 'from_type' => $from_type, 'capital_type' => $item['deep'], 'order_no' => $this->order_detail['order_no'], 'contributor_name' => $this->order_detail['goods_name'], 'contributor_id' => $this->user_id, 'contributor_money' => $this->order_detail['goods_price'], ]; } } return $insert_wallet; } public function organizeData($prize_list, $extension) { $insert_wallet = []; $is_frozen = true; $from_type = AddonsEnum::ADDONS_NAME_REGULAR_BONUS.'_'.DistributionEnum::ADDONS_NAME; foreach ($prize_list as $user_id => $item) { $item['price'] = bcmul($item['price'], 1, 2); if ($item['price'] <= 0) continue; $prize_name = self::PRICE_NAME_MAP[$item['deep']] ?? '未知资金类型'; $desc = '用户(' . $user_id . '),获得订单(' . $this->order_detail['order_id'] . ')分销商奖励,奖励类型:' . $prize_name . ',金额:' . $item['price']; $insert_wallet[] = [ 'mall_id' => $this->mall_id, 'user_id' => $user_id, 'is_frozen' => $is_frozen, 'wallet_type' => $this->name, 'money' => $item['price'], 'desc' => $desc, 'source_table' => $extension['source_table'] ?? '', 'source_table_id' => $extension['source_table_id'] ?? '', 'from_type' => $from_type, 'capital_type' => $item['deep'], 'order_no' => $this->order_detail['order_no'], 'contributor_name' => $this->order_detail['goods_name'], 'contributor_id' => $this->user_id, 'contributor_money' => $this->order_detail['goods_price'], ]; } return $insert_wallet; } }