DistributionBase.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. namespace addons\CircleDistribution\common\logic\reward;
  3. use addons\CircleDistribution\common\enums\DistributionEnum;
  4. use addons\CircleDistribution\common\models\Distribution;
  5. use addons\CircleDistribution\common\models\DistributionCommissionBasisLog;
  6. use common\enums\UserWalletEnum;
  7. use services\common\UserWalletService;
  8. abstract class DistributionBase
  9. {
  10. public $mall_id;
  11. public $user_id;
  12. public $basic_conf;
  13. public $distribution_list = [];
  14. public $order_detail = [];
  15. public $name = '';//佣金:price;积分:score
  16. const PRICE_NAME_MAP = [
  17. UserWalletEnum::FIRST => '直推奖励',
  18. UserWalletEnum::SECOND => '间推奖励',
  19. UserWalletEnum::THIRD => '分销奖励',
  20. ];
  21. public function __construct($mall_id, $user_id, $basic_conf, $distribution_list, $order_detail, $name = 'commission')
  22. {
  23. $this->mall_id = $mall_id;
  24. $this->name = $name;
  25. $this->user_id = $user_id;
  26. $this->basic_conf = $basic_conf;
  27. $this->distribution_list = $distribution_list;
  28. $this->order_detail = $order_detail;
  29. }
  30. public function addFrozenCommission()
  31. {
  32. // 验证
  33. $config = $this->getLevelConfig();
  34. $level = 1;
  35. //未开启
  36. if (empty($this->basic_conf['is_enable'])) return;
  37. ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules('order_detail');
  38. $prize_key_map = [DistributionEnum::DI_FIRST, DistributionEnum::DI_SECOND, DistributionEnum::DI_THIRD];
  39. $prize_list = [];
  40. for ($deep = 0; $deep < $level; $deep++) {
  41. if (!empty($this->distribution_list[$deep])) {
  42. $config_arr = $this->getRewardConfig($this->user_id,$this->distribution_list[$deep]->user_id);
  43. if(!$config_arr){
  44. //查询不到配置
  45. \Yii::error('CircleDistribution DistributionBase:addFrozenCommission 查询不到配置');
  46. continue;
  47. }
  48. $prize = $this->computing($config_arr, $money, 'first_prize', $multiple);
  49. if ($prize > 0) {
  50. //查询订单是否发放过奖励
  51. $exist = DistributionCommissionBasisLog::findOne([
  52. 'mall_id' => $this->mall_id,
  53. 'source_table' => $extension['source_table'],
  54. 'source_table_id' => $extension['source_table_id'],
  55. 'type' => $this->name,
  56. 'from_type' => $extension['from_type'],
  57. 'user_id' => $this->distribution_list[$deep]->user_id,
  58. ]);
  59. if(!$exist){
  60. // 批处理组装数据
  61. $prize_list[$this->distribution_list[$deep]->user_id] = [
  62. 'price' => $prize,
  63. 'distribution_id' => $this->distribution_list[$deep]->id,
  64. 'deep'=>DistributionEnum::DI_FIRST,
  65. 'distribution_level' => $this->distribution_list[$deep]->level,
  66. 'need_repurchase' => $config_arr['need_repurchase']
  67. ];
  68. $extension['distribution_user_id'] = $this->distribution_list[$deep]->user_id;
  69. }
  70. }
  71. }
  72. }
  73. if(empty($prize_list)) return 0;
  74. $insert_wallet = $this->packagingData($prize_list, $extension);
  75. // 批量插入数据
  76. $money = 0;
  77. try {
  78. //投递到资产队列
  79. if($insert_wallet){
  80. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  81. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  82. foreach ($insert_wallet as $k=>$user){
  83. $distribution = Distribution::findOne(['user_id'=>$user['user_id'],'mall_id'=>$this->mall_id]);
  84. $field = 'total_'.$this->name;
  85. $distribution->$field += $user['money'];
  86. $money +=$user['money'];
  87. $res = $distribution->save();
  88. if (empty($res)) throw new \Exception( $distribution->getErrorMessage());
  89. }
  90. }
  91. $this->addRewardConfigLog($extension);
  92. return $money;
  93. } catch (\Exception $e) {
  94. \Yii::error('DistributionBase:addFrozenCommission'.$e->getMessage());
  95. return 0 ;
  96. }
  97. }
  98. /**
  99. * @desc:计算
  100. * @Author: hua
  101. * @Date: 2021/10/27
  102. * @Time: 18:28
  103. * @Copyright: copyright (c) 2021 广东七件事集团
  104. * @param $config
  105. * @param $money
  106. * @param $prize_key
  107. * @param int $multiple
  108. * @return float|int
  109. */
  110. private function computing($config, $money, $prize_key, $multiple = 1)
  111. {
  112. $is_percent_key = "is_percent";
  113. $num = 0;
  114. if (isset($config[$is_percent_key]) && isset($config[$prize_key])) {
  115. $num = $config[$is_percent_key] == 0 ? $money * $config[$prize_key] / 100 * $multiple : $config[$prize_key] * $multiple;
  116. }
  117. return $num;
  118. }
  119. abstract public function getLevelConfig();
  120. abstract public function getRules($source_table);
  121. abstract public function addRewardConfigLog($extension);
  122. }