| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- namespace addons\CircleDistribution\common\logic\reward;
- use addons\CircleDistribution\common\enums\DistributionEnum;
- use addons\CircleDistribution\common\models\Distribution;
- use addons\CircleDistribution\common\models\DistributionCommissionBasisLog;
- use common\enums\UserWalletEnum;
- use services\common\UserWalletService;
- abstract class DistributionBase
- {
- public $mall_id;
- public $user_id;
- public $basic_conf;
- public $distribution_list = [];
- public $order_detail = [];
- public $name = '';//佣金:price;积分:score
- const PRICE_NAME_MAP = [
- UserWalletEnum::FIRST => '直推奖励',
- 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);
- }
|