'直推奖励', UserWalletEnum::SECOND => '间推奖励', UserWalletEnum::THIRD => '分销奖励', ]; public function __construct($mall_id, $user_id, $basic_conf, $distribution_list, $order_detail, $name = 'commission') { $this->mall_id = $mall_id; $this->name = $name; $this->user_id = $user_id; $this->basic_conf = $basic_conf; $this->distribution_list = $distribution_list; $this->order_detail = $order_detail; } public function addFrozenCommission() { // 验证 $config = $this->getLevelConfig(); $regular_bonus_setting = $this->regular_bonus_goods_setting; if (!isset($this->basic_conf['is_self_buy'])) $this->basic_conf['is_self_buy'] = 0; $level = $this->basic_conf['level']; if (empty($level)) return; if(!empty($this->distribution_goods_setting) && $this->name == 'score'){ $extra = !empty($this->distribution_goods_setting['extra']) && is_string($this->distribution_goods_setting['extra']) ? json_decode($this->distribution_goods_setting['extra'], true) : []; $enable_limit_level = isset($extra['score']) ? $extra['score']['enable_limit_level'] : 0; if($enable_limit_level == 1) { $limit_level = isset($extra['score']) ? $extra['score']['limit_level'] : []; $u_istribute = Distribution::find()->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED])->select('user_id,level')->one(); if(empty($u_istribute) || !in_array($u_istribute->level, (array)$limit_level)) return; } } ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules('order_detail'); $prize_key_map = [DistributionEnum::DI_FIRST, DistributionEnum::DI_SECOND, DistributionEnum::DI_THIRD]; $prize_list = []; $regular_bonus_prize_list = []; for ($deep = 0; $deep < $level; $deep++) { if (!empty($this->distribution_list[$deep])) { if (isset($config[$this->distribution_list[$deep]->level])) { $config_arr = $config[$this->distribution_list[$deep]->level]; } else { if(empty($this->order_detail['store_id'])&&empty($this->order_detail['mch_id'])){ $config_arr = json_decode($this->basic_conf[$this->name],true); }else{ $config_arr =[]; } } $prize = $this->computing($config_arr, $money, $prize_key_map[$deep] . '_prize', $multiple); \Yii::error("{$this->distribution_list[$deep]->user_id} => {$prize}"); if ($this->name == 'score' && $this->basic_conf['is_reward_score_limit']) { //开启了分销商积分上限值,重新计算奖励积分 $prize = $this->computeResultsInScore($this->distribution_list[$deep]->user_id, $prize); } if ($prize > 0) { // 批处理组装数据 $prize_list[$this->distribution_list[$deep]->user_id] = ['price' => $prize, 'distribution_id' => $this->distribution_list[$deep]->id, 'deep'=>$prize_key_map[$deep],'distribution_level' => $this->distribution_list[$deep]->level]; } // 定期分红业务 if (isset($regular_bonus_setting[$this->distribution_list[$deep]->level])) { $config_arr = $regular_bonus_setting[$this->distribution_list[$deep]->level]; } else { if(empty($this->order_detail['store_id'])&&empty($this->order_detail['mch_id'])){ $config_arr = []; }else{ $config_arr =[]; } } $prize = $this->computing($config_arr, $money, $prize_key_map[$deep] . '_prize', $multiple); if ($prize > 0) { // 批处理组装数据 $regular_bonus_prize_list[$this->distribution_list[$deep]->user_id] = ['price' => $prize, 'distribution_id' => $this->distribution_list[$deep]->id, 'deep'=>$prize_key_map[$deep],'distribution_level' => $this->distribution_list[$deep]->level]; } } } $insert_wallet = $this->packagingData($prize_list, $extension); $regular_bonus_wallet = $this->organizeData($regular_bonus_prize_list, $extension); if(!empty($regular_bonus_wallet)){ $insert_wallet = array_merge($insert_wallet,$regular_bonus_wallet); } // 批量插入数据 $money = 0; \Yii::error(json_encode($insert_wallet, JSON_UNESCAPED_UNICODE)); try { //投递到资产队列 $this->handleInsertWallet($insert_wallet, $money); $this->addRewardConfigLog(); return $money; } catch (\Exception $e) { \Yii::error('DistributionBase:addFrozenCommission'.$e->getMessage()); \Yii::error('DistributionBase:addFrozenCommission:info'.json_encode([ 'file'=>$e->getFile(), 'line'=>$e->getLine(), 'msg'=>$e->getMessage(), ])); return 0 ; } } private function computing($config, $money, $prize_key, $multiple = 1) { $is_percent_key = "is_percent"; $num = 0; if (isset($config[$is_percent_key]) && isset($config[$prize_key])) { $prize = $config[$prize_key] ?: 0; $prize = $prize > 0 ? $prize : 0; $num = $config[$is_percent_key] == 0 ? $money * $prize / 100 * $multiple : $prize * $multiple; } return $num; } abstract public function getLevelConfig(); abstract public function getRules($source_table); abstract public function addRewardConfigLog(); public function organizeData($prize_list, $extension) { return []; } public function handleInsertWallet($insert_wallet, &$money) { //投递到资产队列 if($insert_wallet){ $status = StatusEnum::ENABLED; if($this->name != 'digital'){ $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } foreach ($insert_wallet as $k=>$user){ if($user['wallet_type'] == 'digital'){ $res = UserDigital::handleUserDigital($user['mall_id'],$user['user_id'],$user['money'],$user['is_frozen'],$user); if($res === false) throw new \Exception(UserDigital::getStaticError()); } if($user['from_type'] == AddonsEnum::ADDONS_NAME_REGULAR_BONUS.'_'.DistributionEnum::ADDONS_NAME) continue; $distribution = Distribution::findOne(['user_id'=>$user['user_id'],'status'=>[StatusEnum::ENABLED,StatusEnum::DISABLED],'mall_id'=>$this->mall_id]); if(empty($distribution)) continue; $field = 'total_'.$this->name; $distribution->$field += $user['money']; $money +=$user['money']; $res = $distribution->save(); if (empty($res)) throw new \Exception(Distribution::getStaticError()); } if($this->is_enable_regular_bonus){ TaskHelper::pushTaskQueue(RabbitMqEnum::EXCHANGE_TASK,RabbitMqEnum::TASK_QUEUE, [ 'mall_id' => $this->mall_id, 'order_detail_id' => $this->order_detail['id'], 'addons_name' => DistributionEnum::ADDONS_NAME, 'status' => (int)$status, ], $this->regular_bonus_handle_class, 'handleAgentOrDistributionWalletData', function(AMQPMessage $message){ // 生产错误 \Yii::error('发送异步任务失败'); }); } if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_MEMBER_EQUAL_PROFITS) && $this->name == 'commission') { // 触发会员平级分润奖励 $commision_data_list = ['commision_data_list' => $insert_wallet, 'addons' => AddonsEnum::ADDONS_NAME_DISTRIBUTION, 'order_no' => $this->order_detail['order_no'], 'order_detail' => $this->order_detail]; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, $commision_data_list,\addons\MemberEqualProfits\common\services\CommisionLogService::class, 'handle'); } } } public function computeResultsInScore($user_id, $score) { if ($score <= 0) { return $score; } $distribution = Distribution::find()->where(['mall_id' => $this->mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED])->select('user_id,total_score')->one(); //累计积分 $total_score = $distribution->total_score; //累计积分大于等于积分上限值不可继续获得积分 if ($total_score >= $this->basic_conf['reward_score_limit'] || $this->basic_conf['reward_score_limit'] == 0) { return 0; } //计算还可获得的积分值 $available_score = bcsub($this->basic_conf['reward_score_limit'], $total_score, 2); //获得积分值不可超过积分上限值 return min($score, $available_score); } }