AgentReward.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. namespace addons\LuckyGroup\common\logic\reward;
  3. use addons\Agent\common\enums\AgentEnum;
  4. use addons\Agent\common\enums\ComputingEnum;
  5. use addons\Agent\common\logic\reward\AgentBase;
  6. use addons\Distribution\common\models\Distribution;
  7. use addons\LuckyGroup\common\enums\LuckyGroupEnum;
  8. use addons\LuckyGroup\common\logic\customize\Customize;
  9. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  10. use services\common\UserWalletService;
  11. /**
  12. * @desc 经销商奖励
  13. * Class AgentReward
  14. * @Author: hua
  15. * @DateTime: 2021/10/27 15:24
  16. * @Copyright: copyright (c) 2021 广东七件事集团
  17. * @package addons\Agent\common\logic\reward
  18. */
  19. class AgentReward extends AgentBase
  20. {
  21. public $level_config;//等级配置
  22. public $goods_config;//商品独立设置
  23. public $extension;//扩展
  24. public $order_detail = [];
  25. public function addFrozenCommission()
  26. {
  27. // 验证
  28. $config = $this->getLevelConfig();
  29. if (!isset($this->basic_conf['is_self_buy'])) $this->basic_conf['is_self_buy'] = 0;
  30. if (!isset($this->basic_conf['team_prize_deep'])) $this->basic_conf['team_prize_deep'] = 0;
  31. if (!isset($this->basic_conf['equal_prize_deep'])) $this->basic_conf['equal_prize_deep'] = 0;
  32. if (!isset($this->basic_conf['equal_settle_type'])) $this->basic_conf['equal_settle_type'] = 0;
  33. if (!isset($this->basic_conf['calculation_basis'])) $this->basic_conf['calculation_basis'] = 0;
  34. ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules();
  35. // 所有经销商数量
  36. $all_agent_num = count($this->agent_list);
  37. // 初始化渠道奖代理
  38. if (empty($this->team_prize_agents)) {
  39. $current_agent_level = 0;
  40. foreach ($this->agent_list as $key => $agent) {
  41. if ($agent->level > $current_agent_level) {
  42. $this->team_prize_agents[$key] = $agent;
  43. $current_agent_level = $agent->level;
  44. }
  45. }
  46. }
  47. $team_prize_num = 0;
  48. $team_prize_list = [];
  49. $extra_prize_list = [];
  50. $equal_prize_list = [];
  51. $over_prize_list = [];
  52. $log_total_price = 0;
  53. $deduct_agent_prize_list = [];
  54. foreach ($this->team_prize_agents as $key => $team_agent) {
  55. $team_prize = 0;
  56. $next_team_agent = next($this->team_prize_agents);
  57. // if ($team_prize_num < $this->basic_conf['team_prize_deep']) {
  58. //计算渠道奖励
  59. $team_prize = $this->computing($config[$team_agent->level], $money, 'team', $multiple);
  60. if ($team_prize > 0) {
  61. $team_prize -= $log_total_price;
  62. // 批处理组装数据
  63. $team_prize_list[$team_agent->user_id] = ['price' => $team_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  64. $team_prize_num++;
  65. $log_total_price += $team_prize;
  66. }
  67. // }
  68. //计算额外奖励
  69. $extra_prize = $this->computing($config[$team_agent->level], $money, 'extra', $multiple);
  70. if ($extra_prize > 0) {
  71. // 批处理组装数据
  72. $extra_prize_list[$team_agent->user_id] = ['price' => $extra_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  73. }
  74. $wait_deduct_equal_money = 0;
  75. if (!empty($this->basic_conf['equal_prize_deep'])) {
  76. $current_agent_list = array_slice($this->agent_list, $key + 1, $all_agent_num - $key - 1);
  77. // 与当前拿级差的人的等级比较,如果等于当前拿级差的人
  78. $team_agent_level = $team_agent->level;
  79. $equal_prize_num = 0; // 平级奖已领取层级数量
  80. foreach ($current_agent_list as $equal_agent) {
  81. // 找到下一个拿级差的人就不继续往下找
  82. if ($equal_agent->level > $team_agent_level) break;
  83. // 如果和拿级差的人等级相同则该经销商可以获得平级奖
  84. if ($equal_agent->level == $team_agent_level && $equal_prize_num < $this->basic_conf['equal_prize_deep']) {
  85. $equal_prize = 0;
  86. switch ($this->basic_conf['calculation_basis']) {
  87. case ComputingEnum::EQUAL_COMPUTING:
  88. // 平级奖默认计算方式,$money
  89. $equal_prize = $this->computing($config[$equal_agent->level], $money, 'equal', $multiple);
  90. break;
  91. case ComputingEnum::EQUAL_COMPUTING_PARENT:
  92. // 计算依据,1=从上级极差收益计算可得的平级奖
  93. if ($team_prize_num < $this->basic_conf['team_prize_deep'] && !empty($next_team_agent)) {
  94. $parent_team_prize = $this->computing($config[$next_team_agent->level], $money, 'team', $multiple);
  95. $parent_team_prize -= $log_total_price;
  96. $equal_prize = $this->computing($config[$equal_agent->level], $parent_team_prize, 'equal', $multiple);
  97. }
  98. break;
  99. case ComputingEnum::EQUAL_COMPUTING_CHILDREN:
  100. $equal_prize = $this->computing($config[$equal_agent->level], $team_prize, 'equal', $multiple);
  101. break;
  102. }
  103. if ($equal_prize > 0) {
  104. // 批处理组装数据
  105. $equal_prize_list[$equal_agent->user_id] = ['price' => $equal_prize, 'agent_id' => $equal_agent->id, 'agent_level' => $equal_agent->level];
  106. // 从上/下一个拿级差的经销商手下扣除金额
  107. $wait_deduct_equal_money += $equal_prize;
  108. $equal_prize_num++;
  109. }
  110. }
  111. }
  112. }
  113. switch ($this->basic_conf['equal_settle_type']) {
  114. case ComputingEnum::EQUAL_SETTLE_PARENT:
  115. //上级级拿渠道奖者付平级奖
  116. if ($next_team_agent) $deduct_agent_prize_list[$next_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money;
  117. break;
  118. case ComputingEnum::EQUAL_SETTLE_CHILDREN:
  119. //下级拿渠道奖者付平级奖
  120. $prev_team_agent = $team_agent;
  121. $deduct_agent_prize_list[$prev_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money;
  122. break;
  123. }
  124. }
  125. if (count($this->agent_list) >= 2) {
  126. //// 推荐人等级小于被推荐人,拿越级奖,只判断第一个拿渠道奖的上级是否会有越级奖
  127. if ($this->agent_list[0]->level > $this->agent_list[1]->level) {
  128. $over_agent = $this->agent_list[1];
  129. $over_prize = $this->computing($config[$over_agent->level], $money, 'over', $multiple);
  130. if ($over_prize > 0) {
  131. $over_prize_list[$over_agent->user_id] = ['price' => $over_prize, 'agent_id' => $over_agent->id, 'agent_level' => $over_agent->level];
  132. }
  133. }
  134. }
  135. $insert_wallet = $this->getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list);
  136. // 批量插入数据
  137. try {
  138. //投递到资产队列
  139. if ($insert_wallet) {
  140. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  141. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  142. foreach ($insert_wallet as $k => $user) {
  143. if (isset($this->order_detail['group_user_list'][$user['user_id']])) {
  144. $group_user = $this->order_detail['group_user_list'][$user['user_id']];
  145. $group_user->commission += $user['money'];
  146. $res = $group_user->save();
  147. if (empty($res)) throw new \Exception(Distribution::getStaticError());
  148. }
  149. }
  150. }
  151. $this->addRewardConfigLog();
  152. } catch (\Exception $e) {
  153. echo 'AgentReward:addFrozenCommission' . $e->getMessage();
  154. }
  155. }
  156. /**
  157. * @desc:等级配置
  158. * @Author: hua
  159. * @Date: 2021/10/28
  160. * @Time: 16:09
  161. * @Copyright: copyright (c) 2021 广东七件事集团
  162. * @return array
  163. */
  164. public function getLevelConfig()
  165. {
  166. $config_arr = $this->order_detail['level_config'];
  167. $this->level_config = $config_arr;
  168. return $config_arr;
  169. }
  170. /**
  171. * @desc:奖励规则
  172. * @Author: hua
  173. * @Date: 2021/10/28
  174. * @Time: 16:08
  175. * @Copyright: copyright (c) 2021 广东七件事集团
  176. * @return array
  177. */
  178. public function getRules(int $method = null)
  179. {
  180. $money = 1;
  181. $multiple = 1;
  182. $extension = ['source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $this->order_detail['id'], 'from_type' => LuckyGroupEnum::ADDONS_NAME];
  183. $this->extension = $extension;
  184. return ['money' => $money, 'multiple' => $multiple, 'extension' => $extension];
  185. }
  186. /**
  187. * @desc:记录每次触发奖励的相关配置
  188. * @Author: hua
  189. * @Date: 2021/11/18
  190. * @Time: 11:09
  191. * @Copyright: copyright (c) 2021 广东七件事集团
  192. */
  193. public function addRewardConfigLog()
  194. {
  195. }
  196. /**
  197. * @desc:组装数据
  198. * @Author: hua
  199. * @Date: 2021/11/18
  200. * @Time: 15:29
  201. * @Copyright: copyright (c) 2021 广东七件事集团
  202. * @param $capital_type //奖励类型
  203. * @param $compute_type //支付完成/订单完成结算
  204. * @param $prize_list //奖励列表
  205. * @param $extension //扩展列表
  206. * @param $deduct_prize_list //扣减奖励
  207. * @return array
  208. */
  209. public function packData($capital_type, $compute_type, $prize_list, $extension, $deduct_prize_list = [])
  210. {
  211. $type_map = ComputingEnum::getTypeMap();
  212. $insert_wallet = [];
  213. $is_frozen = false;
  214. $from_type = $extension['from_type'] ?? AgentEnum::ADDONS_NAME;
  215. $customize_text = \Yii::$app->services->setting->addons->get($this->mall_id, LuckyGroupEnum::ADDONS_NAME, 'customize_text');
  216. $customize_reward_name = \Yii::$app->services->setting->addons->get($this->mall_id, LuckyGroupEnum::ADDONS_NAME, 'customize_reward_name');
  217. $customize_arr = array_merge($customize_text, $customize_reward_name);
  218. $group_buy_order_text = Customize::to($customize_arr, 'group_buy_order_text');
  219. foreach ($prize_list as $user_id => $item) {
  220. if (!empty($deduct_prize_list[$user_id]['deduct_money'])) $item['price'] -= $deduct_prize_list[$user_id]['deduct_money'];
  221. $item['price'] =bcmul($item['price'],1,2);
  222. if ($item['price'] > 0) {
  223. switch ($capital_type) {
  224. case ComputingEnum::TEAM_PRIZE:
  225. $string = Customize::to($customize_arr, 'agent_reward_text');
  226. break;
  227. case ComputingEnum::EQUAL_PRIZE:
  228. $string = Customize::to($customize_arr, 'equal_reward_text');
  229. break;
  230. case ComputingEnum::OVER_PRIZE:
  231. $string = Customize::to($customize_arr, 'over_reward_text');
  232. break;
  233. }
  234. // $prize_name = $type_map[$capital_type] ?? '未知资金类型';
  235. $desc = '用户(' . $user_id . '),获得' . ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $this->order_detail['id'] . ')' . ($string ?? '"未知资金类型');
  236. // $desc = '用户(' . $user_id . '),获得订单(' . $this->order_detail['order_id'] . ')奖励,奖励类型:' . $prize_name . ',金额:' . $item['price'];
  237. // echo $desc.PHP_EOL;
  238. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $user_id,
  239. 'is_frozen' => $is_frozen, 'wallet_type' => $this->name, 'money' => $item['price'],
  240. 'desc' => $desc,
  241. 'source_table' => $extension['source_table'] ?? '',
  242. 'source_table_id' => $extension['source_table_id'] ?? '',
  243. 'from_type' => $from_type,
  244. 'capital_type' => $capital_type,
  245. 'order_no' =>$this->order_detail['order_no']??'',
  246. 'contributor_name' =>$this->order_detail['goods_name']??'',
  247. 'contributor_id' =>$this->user_id??'0',
  248. 'contributor_money' =>$this->order_detail['goods_price']??'0',
  249. ];
  250. }
  251. }
  252. return $insert_wallet;
  253. }
  254. /**
  255. * @desc:获取投入资金队列的数据
  256. * @Author: hua
  257. * @Date: 2021/11/18
  258. * @Time: 15:46
  259. * @Copyright: copyright (c) 2021 广东七件事集团
  260. * @param $team_prize_list
  261. * @param $equal_prize_list
  262. * @param $extra_prize_list
  263. * @param $over_prize_list
  264. * @param $deduct_agent_prize_list
  265. * @return array
  266. */
  267. public function getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list)
  268. {
  269. $extension = $this->extension;
  270. $compute_type = $this->basic_conf['compute_type']??1;
  271. $team_reward_arr = $this->packData(ComputingEnum::TEAM_PRIZE, $compute_type, $team_prize_list, $extension, $deduct_agent_prize_list);
  272. $over_reward_arr = $this->packData(ComputingEnum::OVER_PRIZE, $compute_type, $over_prize_list, $extension);
  273. $equal_reward_arr = $this->packData(ComputingEnum::EQUAL_PRIZE, $compute_type, $equal_prize_list, $extension);
  274. return array_merge($team_reward_arr, $over_reward_arr, $equal_reward_arr);
  275. }
  276. }