getLevelConfig(); if (!isset($this->basic_conf['is_self_buy'])) $this->basic_conf['is_self_buy'] = 0; if (!isset($this->basic_conf['team_prize_deep'])) $this->basic_conf['team_prize_deep'] = 0; if (!isset($this->basic_conf['equal_prize_deep'])) $this->basic_conf['equal_prize_deep'] = 0; if (!isset($this->basic_conf['equal_settle_type'])) $this->basic_conf['equal_settle_type'] = 0; if (!isset($this->basic_conf['calculation_basis'])) $this->basic_conf['calculation_basis'] = 0; ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules(); // 所有经销商数量 $all_agent_num = count($this->agent_list); // 初始化渠道奖代理 if (empty($this->team_prize_agents)) { $current_agent_level = 0; foreach ($this->agent_list as $key => $agent) { if ($agent->level > $current_agent_level) { $this->team_prize_agents[$key] = $agent; $current_agent_level = $agent->level; } } } $team_prize_num = 0; $team_prize_list = []; $extra_prize_list = []; $equal_prize_list = []; $over_prize_list = []; $log_total_price = 0; $deduct_agent_prize_list = []; foreach ($this->team_prize_agents as $key => $team_agent) { $team_prize = 0; $next_team_agent = next($this->team_prize_agents); // if ($team_prize_num < $this->basic_conf['team_prize_deep']) { //计算渠道奖励 $team_prize = $this->computing($config[$team_agent->level], $money, 'team', $multiple); if ($team_prize > 0) { $team_prize -= $log_total_price; // 批处理组装数据 $team_prize_list[$team_agent->user_id] = ['price' => $team_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level]; $team_prize_num++; $log_total_price += $team_prize; } // } //计算额外奖励 $extra_prize = $this->computing($config[$team_agent->level], $money, 'extra', $multiple); if ($extra_prize > 0) { // 批处理组装数据 $extra_prize_list[$team_agent->user_id] = ['price' => $extra_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level]; } $wait_deduct_equal_money = 0; if (!empty($this->basic_conf['equal_prize_deep'])) { $current_agent_list = array_slice($this->agent_list, $key + 1, $all_agent_num - $key - 1); // 与当前拿级差的人的等级比较,如果等于当前拿级差的人 $team_agent_level = $team_agent->level; $equal_prize_num = 0; // 平级奖已领取层级数量 foreach ($current_agent_list as $equal_agent) { // 找到下一个拿级差的人就不继续往下找 if ($equal_agent->level > $team_agent_level) break; // 如果和拿级差的人等级相同则该经销商可以获得平级奖 if ($equal_agent->level == $team_agent_level && $equal_prize_num < $this->basic_conf['equal_prize_deep']) { $equal_prize = 0; switch ($this->basic_conf['calculation_basis']) { case ComputingEnum::EQUAL_COMPUTING: // 平级奖默认计算方式,$money $equal_prize = $this->computing($config[$equal_agent->level], $money, 'equal', $multiple); break; case ComputingEnum::EQUAL_COMPUTING_PARENT: // 计算依据,1=从上级极差收益计算可得的平级奖 if ($team_prize_num < $this->basic_conf['team_prize_deep'] && !empty($next_team_agent)) { $parent_team_prize = $this->computing($config[$next_team_agent->level], $money, 'team', $multiple); $parent_team_prize -= $log_total_price; $equal_prize = $this->computing($config[$equal_agent->level], $parent_team_prize, 'equal', $multiple); } break; case ComputingEnum::EQUAL_COMPUTING_CHILDREN: $equal_prize = $this->computing($config[$equal_agent->level], $team_prize, 'equal', $multiple); break; } if ($equal_prize > 0) { // 批处理组装数据 $equal_prize_list[$equal_agent->user_id] = ['price' => $equal_prize, 'agent_id' => $equal_agent->id, 'agent_level' => $equal_agent->level]; // 从上/下一个拿级差的经销商手下扣除金额 $wait_deduct_equal_money += $equal_prize; $equal_prize_num++; } } } } switch ($this->basic_conf['equal_settle_type']) { case ComputingEnum::EQUAL_SETTLE_PARENT: //上级级拿渠道奖者付平级奖 if ($next_team_agent) $deduct_agent_prize_list[$next_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money; break; case ComputingEnum::EQUAL_SETTLE_CHILDREN: //下级拿渠道奖者付平级奖 $prev_team_agent = $team_agent; $deduct_agent_prize_list[$prev_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money; break; } } if (count($this->agent_list) >= 2) { //// 推荐人等级小于被推荐人,拿越级奖,只判断第一个拿渠道奖的上级是否会有越级奖 if ($this->agent_list[0]->level > $this->agent_list[1]->level) { $over_agent = $this->agent_list[1]; $over_prize = $this->computing($config[$over_agent->level], $money, 'over', $multiple); if ($over_prize > 0) { $over_prize_list[$over_agent->user_id] = ['price' => $over_prize, 'agent_id' => $over_agent->id, 'agent_level' => $over_agent->level]; } } } $insert_wallet = $this->getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list); // 批量插入数据 try { //投递到资产队列 if ($insert_wallet) { $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); foreach ($insert_wallet as $k => $user) { if (isset($this->order_detail['group_user_list'][$user['user_id']])) { $group_user = $this->order_detail['group_user_list'][$user['user_id']]; $group_user->commission += $user['money']; $res = $group_user->save(); if (empty($res)) throw new \Exception(Distribution::getStaticError()); } } } $this->addRewardConfigLog(); } catch (\Exception $e) { echo 'AgentReward:addFrozenCommission' . $e->getMessage(); } } /** * @desc:等级配置 * @Author: hua * @Date: 2021/10/28 * @Time: 16:09 * @Copyright: copyright (c) 2021 广东七件事集团 * @return array */ public function getLevelConfig() { $config_arr = $this->order_detail['level_config']; $this->level_config = $config_arr; return $config_arr; } /** * @desc:奖励规则 * @Author: hua * @Date: 2021/10/28 * @Time: 16:08 * @Copyright: copyright (c) 2021 广东七件事集团 * @return array */ public function getRules(int $method = null) { $money = 1; $multiple = 1; $extension = ['source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $this->order_detail['id'], 'from_type' => LuckyGroupEnum::ADDONS_NAME]; $this->extension = $extension; return ['money' => $money, 'multiple' => $multiple, 'extension' => $extension]; } /** * @desc:记录每次触发奖励的相关配置 * @Author: hua * @Date: 2021/11/18 * @Time: 11:09 * @Copyright: copyright (c) 2021 广东七件事集团 */ public function addRewardConfigLog() { } /** * @desc:组装数据 * @Author: hua * @Date: 2021/11/18 * @Time: 15:29 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $capital_type //奖励类型 * @param $compute_type //支付完成/订单完成结算 * @param $prize_list //奖励列表 * @param $extension //扩展列表 * @param $deduct_prize_list //扣减奖励 * @return array */ public function packData($capital_type, $compute_type, $prize_list, $extension, $deduct_prize_list = []) { $type_map = ComputingEnum::getTypeMap(); $insert_wallet = []; $is_frozen = false; $from_type = $extension['from_type'] ?? AgentEnum::ADDONS_NAME; $customize_text = \Yii::$app->services->setting->addons->get($this->mall_id, LuckyGroupEnum::ADDONS_NAME, 'customize_text'); $customize_reward_name = \Yii::$app->services->setting->addons->get($this->mall_id, LuckyGroupEnum::ADDONS_NAME, 'customize_reward_name'); $customize_arr = array_merge($customize_text, $customize_reward_name); $group_buy_order_text = Customize::to($customize_arr, 'group_buy_order_text'); foreach ($prize_list as $user_id => $item) { if (!empty($deduct_prize_list[$user_id]['deduct_money'])) $item['price'] -= $deduct_prize_list[$user_id]['deduct_money']; $item['price'] =bcmul($item['price'],1,2); if ($item['price'] > 0) { switch ($capital_type) { case ComputingEnum::TEAM_PRIZE: $string = Customize::to($customize_arr, 'agent_reward_text'); break; case ComputingEnum::EQUAL_PRIZE: $string = Customize::to($customize_arr, 'equal_reward_text'); break; case ComputingEnum::OVER_PRIZE: $string = Customize::to($customize_arr, 'over_reward_text'); break; } // $prize_name = $type_map[$capital_type] ?? '未知资金类型'; $desc = '用户(' . $user_id . '),获得' . ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $this->order_detail['id'] . ')' . ($string ?? '"未知资金类型'); // $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' => $capital_type, 'order_no' =>$this->order_detail['order_no']??'', 'contributor_name' =>$this->order_detail['goods_name']??'', 'contributor_id' =>$this->user_id??'0', 'contributor_money' =>$this->order_detail['goods_price']??'0', ]; } } return $insert_wallet; } /** * @desc:获取投入资金队列的数据 * @Author: hua * @Date: 2021/11/18 * @Time: 15:46 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $team_prize_list * @param $equal_prize_list * @param $extra_prize_list * @param $over_prize_list * @param $deduct_agent_prize_list * @return array */ public function getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list) { $extension = $this->extension; $compute_type = $this->basic_conf['compute_type']??1; $team_reward_arr = $this->packData(ComputingEnum::TEAM_PRIZE, $compute_type, $team_prize_list, $extension, $deduct_agent_prize_list); $over_reward_arr = $this->packData(ComputingEnum::OVER_PRIZE, $compute_type, $over_prize_list, $extension); $equal_reward_arr = $this->packData(ComputingEnum::EQUAL_PRIZE, $compute_type, $equal_prize_list, $extension); return array_merge($team_reward_arr, $over_reward_arr, $equal_reward_arr); } }