| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- <?php
- namespace addons\Distribution\common\logic\reward;
- use addons\Distribution\common\enums\ComputingEnum;
- use addons\Distribution\common\enums\DistributionEnum;
- use addons\Distribution\common\models\Distribution;
- use common\enums\AddonsEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\TaskHelper;
- use common\helpers\FormatHelper;
- use common\models\mall\MallAddons;
- use common\models\user\UserDigital;
- use PhpAmqpLib\Message\AMQPMessage;
- 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
- public $distribution_goods_setting = [];
- public $regular_bonus_handle_class = '\addons\RegularBonus\common\services\CommissionService';
- /** @var \addons\RegularBonus\common\services\CommissionService|null $regular_bonus_handle_instance */
- public $regular_bonus_handle_instance;
- public $is_enable_regular_bonus = 0;
- public $regular_bonus_goods_setting = [];
- 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();
- $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);
- }
- }
|