BonusPoolLogic.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. namespace addons\LuckyGroup\common\logic\reward;
  3. use addons\LuckyGroup\common\enums\LuckyGroupEnum;
  4. use addons\LuckyGroup\common\models\LuckyGroupBonusLog;
  5. use addons\LuckyGroup\common\models\LuckyGroupBonusPool;
  6. use addons\LuckyGroup\common\models\LuckyGroupFrozenLog;
  7. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  8. use addons\LuckyGroup\common\models\LuckyGroupUser;
  9. use common\enums\UserWalletEnum;
  10. use common\helpers\DateHelper;
  11. use common\models\common\CapitalLog;
  12. use common\models\goods\Goods;
  13. use common\models\mall\MallAddons;
  14. use services\common\UserWalletService;
  15. use yii\db\Exception;
  16. class BonusPoolLogic
  17. {
  18. public static function bonusPoolDividendLog($mall_id)
  19. {
  20. if (!MallAddons::isInstall($mall_id, LuckyGroupEnum::ADDONS_NAME)) return true;
  21. $bonus_pool_conf = \Yii::$app->services->setting->addons->get($mall_id, LuckyGroupEnum::ADDONS_NAME, 'bonus_pool');
  22. $everyday_out_rate = $bonus_pool_conf['everyday_out_rate'] ?? 0; //奖金池分红比例
  23. $pool_win_num = $bonus_pool_conf['cond_complete_num'] ?? 0; //奖金池分红拼中次数条件
  24. $settle_type = $bonus_pool_conf['settle_type']; //结算周期 1 每天 2 每周一 3 每月一号
  25. switch ($settle_type) {
  26. case 1:
  27. $date = DateHelper::today();
  28. break;
  29. case 2:
  30. //今天不是周一,暂不能进行分红哦
  31. if (date("w") != 1) {
  32. return true;
  33. }
  34. $date = DateHelper::thisWeek();
  35. break;
  36. case 3:
  37. // 今天不是一号,暂不能进行分红哦
  38. if (date("d") != 1) {
  39. return true;
  40. }
  41. $date = DateHelper::thisMonth();
  42. break;
  43. }
  44. $time = time();
  45. $start_time = $date['start'] ?? 0;
  46. $end_time = $date['end'] ?? 0;
  47. //todo 加锁
  48. $t = \Yii::$app->db->beginTransaction();
  49. try {
  50. $wallet_type = 'commission';
  51. CapitalLog::$capitalType = "{$wallet_type}";
  52. $count = CapitalLog::find()->where(['mall_id' => $mall_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::POOL_REWARD])
  53. ->andWhere(['>=', 'created_at', $start_time])->andWhere(['<=', 'created_at', $end_time])->count();
  54. if ($count != 0) throw new Exception('商城' . $mall_id . '今天已结算');
  55. $lucky_group_bonus_pool = LuckyGroupBonusPool::getOne([['mall_id' => $mall_id]], false);
  56. if (empty($lucky_group_bonus_pool)) throw new Exception("商城:{$mall_id}:暂无奖金池金额");
  57. $bonus_pool_sum = $lucky_group_bonus_pool['money'] ?? 0; //奖金池金额
  58. $pool_money = bcdiv($bonus_pool_sum * $everyday_out_rate,100,2);//本次拿出分红的金额
  59. var_dump("商城id:{$mall_id},本次拿出分红的金额" . $pool_money);
  60. $res = self::turnOffPriority($mall_id, $bonus_pool_conf, $pool_win_num, $pool_money, $lucky_group_bonus_pool, $wallet_type);
  61. if ($res == false) {
  62. \Yii::error("商城:{$mall_id}:奖金发放错误");
  63. var_dump("商城:{$mall_id}:奖金发放错误");
  64. throw new Exception("商城:{$mall_id}:奖金发放错误");
  65. }
  66. $t->commit();
  67. return true;
  68. } catch (\Exception $e) {
  69. var_dump($e->getMessage());
  70. $t->rollBack();
  71. return false;
  72. }
  73. }
  74. //默认发放规则
  75. public static function turnOffPriority($mall_id, $bonus_pool_conf, $pool_win_num, $money, $lucky_group_bonus_pool, $wallet_type)
  76. {
  77. try {
  78. $total_send_money = 0;
  79. $frozen_log_list = LuckyGroupFrozenLog::lists(['where' => [
  80. ['<>', 'is_send', 1],
  81. ['=', 'prize_type', UserWalletEnum::POOL_REWARD],
  82. ['=', 'mall_id', $mall_id],
  83. ],
  84. 'order' => 'created_at asc'
  85. ], false);
  86. $user_id_arr = array_column($frozen_log_list, 'user_id');
  87. $group_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $user_id_arr], ['>=', 'win_num', $pool_win_num]], 'index' => 'user_id'], false);
  88. $new_frozen_log_list = [];
  89. foreach ($frozen_log_list as $k => $item) {
  90. if (!isset($group_user_list[$item['user_id']])){
  91. unset($frozen_log_list[$k]);
  92. continue;
  93. }
  94. $new_frozen_log_list[$item['user_id']][]=$item;
  95. }
  96. $user_num = count($group_user_list);
  97. $apiece_price = !empty($user_num) ? bcdiv($money , $user_num ,2) : $money;
  98. self::grantReward($new_frozen_log_list, $group_user_list, $apiece_price, $mall_id, $wallet_type, $bonus_pool_conf, $money,$lucky_group_bonus_pool, $total_send_money, $user_num);
  99. $lucky_group_bonus_pool->money += -$total_send_money;
  100. $res = $lucky_group_bonus_pool->save();
  101. if ($res === false) throw new \Exception($lucky_group_bonus_pool::getErrorMessage());
  102. return true;
  103. } catch (Exception $e) {
  104. echo '奖金池分红发放失败' . PHP_EOL . $e->getFile() . '(' . $e->getLine() . ')' . PHP_EOL . "message:" . $e->getMessage();
  105. \Yii::error('奖金池分红发放失败' . PHP_EOL . $e->getFile() . '(' . $e->getLine() . ')' . PHP_EOL . "message:" . $e->getMessage());
  106. return false;
  107. }
  108. }
  109. //发放奖金池冻结佣金
  110. public static function grantReward($new_frozen_log_list, $group_user_list, $apiece_price, $mall_id, $wallet_type, $bonus_pool_conf, $money,$lucky_group_bonus_pool, &$total_send_money, $user_num = 0)
  111. {
  112. $params = [
  113. 'mall_id'=>$mall_id,
  114. 'user_num'=>$user_num,
  115. 'money'=>$money,
  116. 'user_price'=>$apiece_price,
  117. ];
  118. $bonus_log_model = LuckyGroupBonusLog::setData($params);
  119. if ($bonus_log_model == false) throw new Exception('添加分红记录失败');
  120. $bonus_log_id = $bonus_log_model['id'];
  121. $insert_wallet = [];
  122. foreach ($new_frozen_log_list as $frozen_log_list){
  123. $remain_apiece_price = $apiece_price; //平均每人各能分的到钱
  124. $frozen_log_ids = array_column($frozen_log_list,'source_id');
  125. $lucky_group_order_list = LuckyGroupOrder::lists(['where'=>[['id'=>$frozen_log_ids]],'select'=>'id,order_no,goods_id,total_goods_price,buy_nums','index'=>'id']);
  126. $goods_ids = array_column($lucky_group_order_list,'goods_id');
  127. $goods_list = Goods::lists(['where'=>[['id'=>$goods_ids]],'select'=>'id,goods_name','index'=>'id']);
  128. foreach ($frozen_log_list as $key => $frozen_log) {
  129. $frozen_log_money = $frozen_log['money'];
  130. if ($frozen_log['is_send'] == 2) $frozen_log_money -= $frozen_log['has_money']; // 部分发放,减去上次已经分过的金额
  131. if ($frozen_log_money <= $remain_apiece_price) {
  132. //金额够分--修改状态为已发放
  133. $frozen_log->is_send = 1;
  134. } else {
  135. //不够发放全部
  136. if ($remain_apiece_price > 0) {
  137. $frozen_log_money = $remain_apiece_price;
  138. $frozen_log->is_send = 2;
  139. } else {
  140. break;
  141. }
  142. }
  143. $has_money = $frozen_log['has_money'] + $frozen_log_money; //已发放金额=之前发放的金额+本次发放的金额
  144. $frozen_log->has_money = $has_money;
  145. $frozen_log->settlement_interval = $bonus_pool_conf['settle_type'];
  146. $frozen_log->bonus_pool_sum = $money;
  147. $frozen_log->bonus_pool_ratio = $bonus_pool_conf['everyday_out_rate'];
  148. $frozen_log->bonus_pool_limit = $remain_apiece_price;
  149. $frozen_log->bonus_log_id = $bonus_log_id;
  150. $res = $frozen_log->save();
  151. if (!$res) throw new \Exception($frozen_log->getErrorMessage());
  152. // 修改用户表佣金值
  153. $Lucky_group_user = $group_user_list[$frozen_log['user_id']];
  154. $Lucky_group_user->commission += $frozen_log_money;
  155. $Lucky_group_user->frozen_commission += -$frozen_log_money;
  156. if (!$Lucky_group_user->save()) throw new \Exception($Lucky_group_user->getErrorMessage());
  157. if($frozen_log_money>0){
  158. $order_no = $goods_name ='';
  159. $contributor_id = $contributor_money = 0;
  160. if(!empty($lucky_group_order_list[$frozen_log['source_id']])){
  161. $order_no = $lucky_group_order_list[$frozen_log['source_id']]['order_no'];
  162. $goods_id = $lucky_group_order_list[$frozen_log['source_id']]['goods_id'];
  163. $contributor_id = $lucky_group_order_list[$frozen_log['source_id']]['user_id'];
  164. if(!empty($lucky_group_order_list[$frozen_log['source_id']]['buy_nums'])){
  165. $contributor_money = intval($lucky_group_order_list[$frozen_log['source_id']]['total_goods_price']/$lucky_group_order_list[$frozen_log['source_id']]['buy_nums']*100)/100;
  166. }else{
  167. $contributor_money =$lucky_group_order_list[$frozen_log['source_id']]['total_goods_price'];
  168. }
  169. if(!empty($goods_list[$goods_id])){
  170. $goods_name = $goods_list[$order_no]['goods_name'];
  171. }
  172. }
  173. $insert_wallet [] = [
  174. 'mall_id' => $mall_id, 'user_id' => $frozen_log['user_id'],
  175. 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $frozen_log_money,
  176. 'desc' => '幸运拼团,奖金池分红,佣金(' . $frozen_log_money . '元)发放',
  177. 'source_table' => LuckyGroupFrozenLog::tableName(),
  178. 'source_table_id' => $frozen_log['id'],
  179. 'from_type' => LuckyGroupEnum::ADDONS_NAME,
  180. 'capital_type' => UserWalletEnum::POOL_REWARD,
  181. 'order_no' =>$order_no,
  182. 'contributor_name' =>$goods_name,
  183. 'contributor_id' =>$contributor_id,
  184. 'contributor_money' =>$contributor_money,
  185. ];
  186. }
  187. $remain_apiece_price -= $frozen_log_money;
  188. $total_send_money += $frozen_log_money;
  189. if ($remain_apiece_price <= 0) break;
  190. }
  191. }
  192. if (!empty($insert_wallet)) {
  193. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  194. if ($res == false) throw new Exception('发送资金队列失败');
  195. }
  196. $bonus_log_model->after_money = $lucky_group_bonus_pool['money'] - $total_send_money;
  197. $bonus_log_model->save();
  198. }
  199. }