LotteryRulesLogic.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace addons\LuckyGroup\common\logic\order;
  3. use addons\LuckyGroup\common\models\LuckyGroupWinLog;
  4. use common\enums\StatusEnum;
  5. class LotteryRulesLogic
  6. {
  7. public function checkWinOrLoss($mall_id, $joining_orders,$user_id_arr, $attend_order_num, $random_win_num, $conf)
  8. {
  9. srand();
  10. $ping_tuan_limit = $conf['ping_tuan_limit'] ?? 0;//拼团限制开关
  11. $win_keys = [];
  12. switch ($ping_tuan_limit) {
  13. case 0:
  14. //默认规则
  15. $win_keys = $this->rulesInit($joining_orders, $attend_order_num, $random_win_num);
  16. break;
  17. case 1:
  18. //累计拼中N次,连续拼不种N次
  19. $win_keys = $this->rules2($conf, $joining_orders,$user_id_arr, $mall_id, $random_win_num);
  20. break;
  21. default:
  22. }
  23. return $win_keys;
  24. }
  25. //默认规则
  26. private function rulesInit($joining_orders, $attend_order_num, $random_win_num)
  27. {
  28. $win_keys= [];
  29. if($joining_orders){
  30. if ($attend_order_num >= $random_win_num) {
  31. if(!empty($random_win_num)){
  32. $win_keys = array_rand($joining_orders, $random_win_num); //随机拼中key
  33. }
  34. } else {
  35. $win_keys = array_rand($joining_orders, $attend_order_num); //随机拼中key
  36. }
  37. }
  38. return $win_keys;
  39. }
  40. //规则2
  41. private function rules2($conf, $joining_orders,$user_id_arr, $mall_id, $random_win_num)
  42. {
  43. $win_keys = [];
  44. if(!empty($random_win_num)){
  45. $ping_tuan_limit_win = $conf['ping_tuan_limit_win'] ?? 0;//累计拼中次数
  46. $ping_tuan_limit_lose = $conf['ping_tuan_limit_lose'] ?? 0;//连续拼不中次数
  47. //开团时,所有参团人员都不满足限制,不随机拼中,则所有参团人员都拼团失败 1:随机;2:不随机
  48. $limit_win_radio = $conf['ping_tuan_limit_win_radio'] ?? 1;
  49. $have_qualification = $have_no_qualification = [];
  50. $win_log_list = LuckyGroupWinLog::lists([
  51. 'where' => [
  52. ['mall_id' => $mall_id],
  53. ['status' => StatusEnum::ENABLED],
  54. ['user_id' => $user_id_arr],
  55. ],
  56. 'select' => 'user_id,sum(win_num) as win_num,sum(loss_num) as loss_num',
  57. 'index' => 'user_id',
  58. 'group' => 'user_id'
  59. ]);
  60. foreach ($joining_orders as $key => $order) {
  61. if (!isset($win_log_list[$order['user_id']])) {
  62. $have_qualification[$key] = $order;//第一次参与该拼团活动,有拼中资格
  63. continue;
  64. }
  65. $win_num = $win_log_list[$order['user_id']]['win_num'] ?? 0;
  66. $loss_num = $win_log_list[$order['user_id']]['loss_num'] ?? 0;
  67. if (!empty($win_num) && !empty($ping_tuan_limit_win) && $win_num % $ping_tuan_limit_win == 0) {
  68. if ($loss_num < $ping_tuan_limit_lose) {
  69. $have_no_qualification[$key] = $order;//没有拼中资格
  70. } else {
  71. //达到累计拼中次数n次后,连续n次拼不中条件
  72. $have_qualification[$key] = $order;//有拼中资格
  73. }
  74. } else {
  75. //没有拼中记录或者用户累计拼中次数对设置的累计拼中次数取模不等0
  76. $have_qualification[$key] = $order;//有拼中资格
  77. }
  78. }
  79. if (empty($have_qualification)) {
  80. if ($limit_win_radio == 1) $win_keys = array_rand($have_no_qualification, $random_win_num); //随机拼中key
  81. return $win_keys;
  82. }
  83. $count = count($have_qualification);
  84. if ($count >= $random_win_num) {
  85. $win_keys = array_rand($have_qualification, $random_win_num); //随机拼中key
  86. return $win_keys;
  87. }
  88. $win_key1 = array_keys($have_qualification);//拼中key
  89. $win_key2 = [];
  90. if ($limit_win_radio == 1) {
  91. $count = $random_win_num - $count;
  92. $win_key2 = array_rand($have_no_qualification, $count); //随机拼中key
  93. if (!is_array($win_key2)) $win_key2 = [$win_key2];
  94. }
  95. $win_keys = array_merge($win_key1, $win_key2);
  96. }
  97. return $win_keys;
  98. }
  99. }