GroupRewardLogic.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <?php
  2. namespace addons\LuckyGroup\common\logic\reward;
  3. use addons\LuckyGroup\common\enums\LuckyGroupEnum;
  4. use addons\LuckyGroup\common\logic\customize\Customize;
  5. use addons\LuckyGroup\common\models\LuckyGroupLevel;
  6. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  7. use addons\LuckyGroup\common\models\LuckyGroupUser;
  8. use common\enums\StatusEnum;
  9. use common\enums\UserWalletEnum;
  10. use common\helpers\Base64Helper;
  11. use common\models\mall\MallAddons;
  12. use common\models\user\UserPartitionRelationship;
  13. class GroupRewardLogic
  14. {
  15. //参团奖励
  16. public static function computeJoinReward($attend_award_setting, $attend_user_type, $mall_id,
  17. $user_id, $order_id,
  18. $win_user_id, $win_order_id,
  19. $loss_user_id, $loss_order_id, &$insert_wallet,$customize_arr,&$attend_reward=0,
  20. $order_no='',$contributor_id=0,$contributor_money=0,$goods_name=''
  21. )
  22. {
  23. foreach ($attend_award_setting as $wallet_type => $money) {
  24. if ($money <= 0) continue;
  25. $is_true = true;
  26. switch ($attend_user_type) {
  27. //1 全部 2 拼中 3 拼不中',
  28. case 1:
  29. break;
  30. case 2:
  31. $user_id = $win_user_id;
  32. $order_id = $win_order_id;
  33. break;
  34. case 3:
  35. $user_id = $loss_user_id;
  36. $order_id = $loss_order_id;
  37. break;
  38. default:
  39. $is_true = false;
  40. }
  41. if ($is_true&&$user_id) {
  42. if($wallet_type=='balance') $attend_reward+=$money;
  43. $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text');
  44. $attend_reward_text = Customize::to($customize_arr,'attend_reward_text');
  45. $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($attend_reward_text ?? '"参团奖励');
  46. $insert_wallet [] = [
  47. 'mall_id' => $mall_id, 'user_id' => $user_id,
  48. 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $money,
  49. 'desc' => $desc,
  50. 'source_table' => LuckyGroupOrder::tableName(),
  51. 'source_table_id' => $order_id,
  52. 'from_type' => LuckyGroupEnum::ADDONS_NAME,
  53. 'capital_type' => UserWalletEnum::ATTEND_REWARD,
  54. 'order_no' => $order_no,
  55. 'contributor_name' =>$goods_name,
  56. 'contributor_id' =>$contributor_id,
  57. 'contributor_money' =>$contributor_money,
  58. ];
  59. }
  60. }
  61. }
  62. //拼中奖励
  63. public static function computeWinReward($win_award_setting, $mall_id, $user_id, $order_id, $win_times, $user_win_times, &$insert_wallet,&$win_reward_scores,&$win_reward_balance,$customize_arr,
  64. $order_no='',$contributor_id=0,$contributor_money=0,$goods_name='')
  65. {
  66. foreach ($win_award_setting as $wallet_type => $money) {
  67. if ($money <= 0) continue;
  68. if($wallet_type=='score') $win_reward_scores+=$money;
  69. if($wallet_type=='balance') $win_reward_balance+=$money;
  70. if (empty($user_win_times) || empty($win_times)) continue;
  71. if ($user_win_times % $win_times != 0) continue;
  72. $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text');
  73. $win_reward_text = Customize::to($customize_arr,'win_reward_text');
  74. $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($win_reward_text ?? '"拼中奖励');
  75. $insert_wallet [] = [
  76. 'mall_id' => $mall_id, 'user_id' => $user_id,
  77. 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $money,
  78. 'desc' => $desc,
  79. 'source_table' => LuckyGroupOrder::tableName(),
  80. 'source_table_id' => $order_id,
  81. 'from_type' => LuckyGroupEnum::ADDONS_NAME,
  82. 'capital_type' => UserWalletEnum::WIN_REWARD,
  83. 'order_no' => $order_no,
  84. 'contributor_name' =>$goods_name,
  85. 'contributor_id' =>$contributor_id,
  86. 'contributor_money' =>$contributor_money,
  87. ];
  88. }
  89. }
  90. //推荐奖励
  91. public static function computeInviteReward($mall_id, $goods_price, $configs, $order_id, $user, &$insert_wallet,$customize_arr,
  92. $order_no='',$contributor_id=0,$goods_name='')
  93. {
  94. if (empty($configs['basic'])) return [];
  95. if (empty($configs['basic']['invited_award_type'])) return [];
  96. $invited_award_type = $configs['basic']['invited_award_type']??'';//奖励类型
  97. $invited_award_mode = $configs['basic']['invited_award_mode']??0;//0固定金额;1百分比
  98. $direct_award = $configs['basic']['direct_award']??0;//直推
  99. $direct_award = intval($direct_award);
  100. $indirect_award = $configs['basic']['indirect_award']??0;//间推
  101. $indirect_award = intval($indirect_award);
  102. if ($invited_award_mode == 0) {
  103. $direct_money = $direct_award;
  104. $indirect_money = $indirect_award;
  105. } else {
  106. $direct_money = bcdiv($direct_award * $goods_price,100,2);
  107. $indirect_money =bcdiv($indirect_award * $goods_price ,100,2);
  108. }
  109. $parent_id = $user['parent_id'];
  110. $second_parent_id = $user['second_parent_id'];
  111. $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text');
  112. $invite_reward_text = Customize::to($customize_arr,'invite_reward_text');
  113. $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($invite_reward_text ?? '"推荐奖励');
  114. if ($direct_money > 0 && $parent_id) {
  115. $insert_wallet [] = [
  116. 'mall_id' => $mall_id, 'user_id' => $parent_id,
  117. 'is_frozen' => false, 'wallet_type' => $invited_award_type, 'money' => $direct_money,
  118. 'desc' => $desc,
  119. 'source_table' => LuckyGroupOrder::tableName(),
  120. 'source_table_id' => $order_id,
  121. 'from_type' => LuckyGroupEnum::ADDONS_NAME,
  122. 'capital_type' => UserWalletEnum::FIRST,
  123. 'order_no' => $order_no,
  124. 'contributor_name' =>$goods_name,
  125. 'contributor_id' =>$contributor_id,
  126. 'contributor_money' =>$goods_price,
  127. ];
  128. }
  129. if ($indirect_money > 0 && $second_parent_id) {
  130. $insert_wallet [] = [
  131. 'mall_id' => $mall_id, 'user_id' => $second_parent_id,
  132. 'is_frozen' => false, 'wallet_type' => $invited_award_type, 'money' => $indirect_money,
  133. 'desc' => $desc,
  134. 'source_table' => LuckyGroupOrder::tableName(),
  135. 'source_table_id' => $order_id,
  136. 'from_type' => LuckyGroupEnum::ADDONS_NAME,
  137. 'capital_type' => UserWalletEnum::SECOND,
  138. 'order_no' => $order_no,
  139. 'contributor_name' =>$goods_name,
  140. 'contributor_id' =>$contributor_id,
  141. 'contributor_money' =>$goods_price,
  142. ];
  143. }
  144. }
  145. //奖金池
  146. public static function computePrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr)
  147. {
  148. if (!empty($configs['bonus_pool']['every_day_bingo_prize'])) {
  149. switch ($configs['bonus_pool']['every_day_bingo_prize']) {
  150. case 1:
  151. //每次拼中奖励
  152. self::everyBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, $frozen_log_arr, $user_frozen_arr,$customize_arr);
  153. break;
  154. case 2:
  155. //累计拼中奖励,阶梯
  156. self::totalBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, $frozen_log_arr, $user_frozen_arr,$customize_arr);
  157. break;
  158. }
  159. }
  160. }
  161. //每次拼中奖励
  162. protected static function everyBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr)
  163. {
  164. if (!empty($group_user['win_num']) && !empty($configs['bonus_pool']['every_day_bingo_nums']) && !empty($configs['bonus_pool']['every_day_bingo_limit_prize'])) {
  165. $every_day_bingo_nums = $configs['bonus_pool']['every_day_bingo_nums'];
  166. $every_day_bingo_limit_prize = $configs['bonus_pool']['every_day_bingo_limit_prize'];
  167. $everyday_out_rate = $configs['bonus_pool']['everyday_out_rate'];
  168. $settle_type = $configs['bonus_pool']['settle_type'];
  169. if ($group_user['win_num'] % $every_day_bingo_nums == 0) {
  170. if ($every_day_bingo_limit_prize > 0) {
  171. $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text');
  172. $every_day_bingo_prize_text = Customize::to($customize_arr,'every_day_bingo_prize_text');
  173. $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')' . ($every_day_bingo_prize_text ?? '"每次拼中奖励');
  174. $frozen_log_arr[] = [
  175. $group_user['mall_id'],
  176. $group_user['user_id'],
  177. $group_user['level'],
  178. $order_id,
  179. LuckyGroupOrder::tableName(),
  180. $every_day_bingo_limit_prize,
  181. 0,
  182. UserWalletEnum::POOL_REWARD,
  183. 'commission',
  184. '',
  185. $desc,
  186. StatusEnum::ENABLED,
  187. $time,
  188. $time,
  189. 0,
  190. $settle_type,
  191. $bonus_pool_sum,
  192. $everyday_out_rate,
  193. 0,
  194. 0,
  195. 0
  196. ];
  197. if (isset($user_frozen_arr[$group_user['user_id']])) {
  198. $user_frozen_arr[$group_user['user_id']] += $every_day_bingo_limit_prize;
  199. } else {
  200. $user_frozen_arr[$group_user['user_id']] = $every_day_bingo_limit_prize;
  201. }
  202. }
  203. }
  204. }
  205. }
  206. //累计拼中奖励
  207. protected static function totalBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr)
  208. {
  209. if (empty($configs['bonus_pool']['win_basic_setting'])) return '';
  210. if (empty($group_user['win_num'])) return '';
  211. $win_num = $group_user['win_num'];
  212. $money = 0;
  213. $everyday_out_rate = $configs['bonus_pool']['everyday_out_rate'];
  214. $win_basic_setting = json_decode($configs['bonus_pool']['win_basic_setting'], true);
  215. $win_arr = array_column($win_basic_setting, 'money', 'times');
  216. $times_arr = array_keys($win_arr);
  217. if (in_array($win_num, $times_arr)) $money = $win_arr[$win_num];
  218. $settle_type = $configs['bonus_pool']['settle_type'];
  219. if ($money > 0) {
  220. $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text');
  221. $pool_reward_text = Customize::to($customize_arr,'pool_reward_text');
  222. $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')' . ($pool_reward_text ?? '"奖金池奖励');
  223. $frozen_log_arr[] = [
  224. $group_user['mall_id'],
  225. $group_user['user_id'],
  226. $group_user['level'],
  227. $order_id,
  228. LuckyGroupOrder::tableName(),
  229. $money,
  230. 0,
  231. UserWalletEnum::POOL_REWARD,
  232. 'commission',
  233. '',
  234. $desc,
  235. StatusEnum::ENABLED,
  236. $time,
  237. $time,
  238. 0,
  239. $settle_type,
  240. $bonus_pool_sum,
  241. $everyday_out_rate,
  242. 0,
  243. 0,
  244. 0
  245. ];
  246. if (isset($user_frozen_arr[$group_user['user_id']])) {
  247. $user_frozen_arr[$group_user['user_id']] += $money;
  248. } else {
  249. $user_frozen_arr[$group_user['user_id']] = $money;
  250. }
  251. }
  252. }
  253. // 参团等级佣金奖励发放
  254. public static function sendGroupCommissionLog($configs, $joining_orders, $user_arr, $activity,$contributor_money=0,$goods_name='')
  255. {
  256. $user_id_arr = array_column($joining_orders, 'user_id');
  257. $orders = array_column($joining_orders, null,'user_id');
  258. $parent_list = self::getUserParentList($user_id_arr);
  259. $parent_ids = [];
  260. $parent_arr = [];
  261. foreach ($parent_list as $user_id => $item) {
  262. array_pop($item);
  263. $parent_id_arr = array_reverse($item);
  264. foreach ($parent_id_arr as &$parent_id) {
  265. $parent_id = Base64Helper::Base642dec($parent_id);
  266. $parent_ids [] = $parent_id;
  267. $parent_arr[$user_id][] = $parent_id;
  268. }
  269. }
  270. $group_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $parent_ids]], 'index' => 'user_id'],false);
  271. //渠道佣金
  272. $order_detail = ['level_config' => self::getLevelConfig($activity)];
  273. $setting = [
  274. 'equal_prize_deep' => $configs['basic']['equal_deep'],
  275. 'equal_settle_type' => $configs['basic']['equal_calculate_type']??0,
  276. 'calculation_basis' => $configs['basic']['equal_calculate_basis']??0,
  277. ];
  278. foreach ($parent_arr as $user_id => $parent_list) {
  279. $order_detail['id'] = $user_arr[$user_id]['order_id'];
  280. $order_detail['group_user_list'] = $group_user_list;
  281. $order_detail['order_no'] = '';
  282. $order_detail['goods_price'] = 0;
  283. if(!empty($orders[$user_id])){
  284. $order_detail['order_no'] = $orders[$user_id]['order_no'];
  285. if(!empty($orders[$user_id]['buy_nums'])){
  286. $order_detail['goods_price'] = bcdiv($orders[$user_id]['total_goods_price'],$orders[$user_id]['buy_nums'],2);
  287. }else{
  288. $order_detail['goods_price'] = $orders[$user_id]['total_goods_price'];
  289. }
  290. }
  291. $order_detail['goods_name'] = $goods_name;
  292. $agent_list = [];
  293. foreach ($parent_list as $parent_id) {
  294. if (isset($group_user_list[$parent_id])) $agent_list[] = $group_user_list[$parent_id];
  295. }
  296. if (!empty($agent_list)) {
  297. $agent_reward_obj = new AgentReward($activity['mall_id'], $user_id, $setting, $agent_list, 0);
  298. $agent_reward_obj->order_detail = $order_detail;
  299. $agent_reward_obj->addFrozenCommission();
  300. }
  301. }
  302. }
  303. //获取上级数据
  304. protected static function getUserParentList($user_id_arr)
  305. {
  306. $user_relation_list = UserPartitionRelationship::lists(['where' => [['user_id' => $user_id_arr]], 'order' => 'part asc']);
  307. $data = [];
  308. foreach ($user_relation_list as $key => $value) {
  309. if (isset($data[$value['user_id']])) {
  310. $data[$value['user_id']] = array_merge($data[$value['user_id']], explode(',', $value['tree']));
  311. } else {
  312. $data[$value['user_id']] = explode(',', $value['tree']);
  313. }
  314. }
  315. return $data;
  316. }
  317. //获取等级数据
  318. protected static function getLevelConfig($activity)
  319. {
  320. $config_arr = [];
  321. $mall_id = $activity['mall_id'];
  322. if (!empty($activity['enable_commison'])) {
  323. $team_commission_setting = json_decode($activity['team_commission_setting'], true);
  324. $equal_commission_setting = json_decode($activity['equal_commission_setting'], true);
  325. $over_commission_setting = json_decode($activity['over_commission_setting'], true);
  326. foreach ($team_commission_setting as $item) {
  327. $config_arr[$item['level']]['is_percent_team'] = 1;
  328. $config_arr[$item['level']]['agent_team_prize'] = $item['team_commission'];
  329. }
  330. foreach ($equal_commission_setting as $item) {
  331. $config_arr[$item['level']]['is_percent_equal'] = 1;
  332. $config_arr[$item['level']]['agent_equal_prize'] = $item['equal_commission'];
  333. }
  334. foreach ($over_commission_setting as $item) {
  335. $config_arr[$item['level']]['is_percent_over'] = 1;
  336. $config_arr[$item['level']]['agent_over_prize'] = $item['over_commission'];
  337. }
  338. } else {
  339. $level_list = LuckyGroupLevel::lists(['where' => [['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED]]]);
  340. foreach ($level_list as $item) {
  341. $config_arr[$item['level']]['is_percent_team'] = 1;
  342. $config_arr[$item['level']]['agent_team_prize'] = $item['team_commission'];
  343. $config_arr[$item['level']]['is_percent_equal'] = 1;
  344. $config_arr[$item['level']]['agent_equal_prize'] = $item['equal_commission'];
  345. $config_arr[$item['level']]['is_percent_over'] = 1;
  346. $config_arr[$item['level']]['agent_over_prize'] = $item['over_commission'];
  347. }
  348. }
  349. return $config_arr;
  350. }
  351. }