'直推奖励', 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(); $level = 1; //未开启 if (empty($this->basic_conf['is_enable'])) 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 = []; for ($deep = 0; $deep < $level; $deep++) { if (!empty($this->distribution_list[$deep])) { $config_arr = $this->getRewardConfig($this->user_id,$this->distribution_list[$deep]->user_id); if(!$config_arr){ //查询不到配置 \Yii::error('CircleDistribution DistributionBase:addFrozenCommission 查询不到配置'); continue; } $prize = $this->computing($config_arr, $money, 'first_prize', $multiple); if ($prize > 0) { //查询订单是否发放过奖励 $exist = DistributionCommissionBasisLog::findOne([ 'mall_id' => $this->mall_id, 'source_table' => $extension['source_table'], 'source_table_id' => $extension['source_table_id'], 'type' => $this->name, 'from_type' => $extension['from_type'], 'user_id' => $this->distribution_list[$deep]->user_id, ]); if(!$exist){ // 批处理组装数据 $prize_list[$this->distribution_list[$deep]->user_id] = [ 'price' => $prize, 'distribution_id' => $this->distribution_list[$deep]->id, 'deep'=>DistributionEnum::DI_FIRST, 'distribution_level' => $this->distribution_list[$deep]->level, 'need_repurchase' => $config_arr['need_repurchase'] ]; $extension['distribution_user_id'] = $this->distribution_list[$deep]->user_id; } } } } if(empty($prize_list)) return 0; $insert_wallet = $this->packagingData($prize_list, $extension); // 批量插入数据 $money = 0; try { //投递到资产队列 if($insert_wallet){ $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); foreach ($insert_wallet as $k=>$user){ $distribution = Distribution::findOne(['user_id'=>$user['user_id'],'mall_id'=>$this->mall_id]); $field = 'total_'.$this->name; $distribution->$field += $user['money']; $money +=$user['money']; $res = $distribution->save(); if (empty($res)) throw new \Exception( $distribution->getErrorMessage()); } } $this->addRewardConfigLog($extension); return $money; } catch (\Exception $e) { \Yii::error('DistributionBase:addFrozenCommission'.$e->getMessage()); return 0 ; } } /** * @desc:计算 * @Author: hua * @Date: 2021/10/27 * @Time: 18:28 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $config * @param $money * @param $prize_key * @param int $multiple * @return float|int */ 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])) { $num = $config[$is_percent_key] == 0 ? $money * $config[$prize_key] / 100 * $multiple : $config[$prize_key] * $multiple; } return $num; } abstract public function getLevelConfig(); abstract public function getRules($source_table); abstract public function addRewardConfigLog($extension); }