StatisticsLogic.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace addons\LuckyGroup\common\logic\statistics;
  3. use addons\LuckyGroup\common\models\LuckyGroupActivity;
  4. use addons\LuckyGroup\common\models\LuckyGroupActivityStatistics;
  5. use addons\LuckyGroup\common\models\LuckyGroupCommissionLog;
  6. use addons\LuckyGroup\common\models\LuckyGroupGoods;
  7. use addons\LuckyGroup\common\models\LuckyGroupLotteryPeriod;
  8. use addons\LuckyGroup\common\models\LuckyGroupOpenRewardLog;
  9. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  10. use common\enums\StatusEnum;
  11. use common\enums\UserWalletEnum;
  12. use common\helpers\LockHelper;
  13. use common\models\common\BalanceLog;
  14. use common\models\common\ScoreLog;
  15. use common\traits\ErrorTrait;
  16. class StatisticsLogic
  17. {
  18. use ErrorTrait;
  19. /**
  20. * @name:
  21. * @msg: 拼团活动数据统计
  22. * @param {int} $mall_id
  23. * @return {*}
  24. */
  25. public static function asyncStatisticsActivityData(int $mall_id)
  26. {
  27. try {
  28. $lock_name = 'LuckyGroup:activity-data-statistics-look:mall_id:' . $mall_id;
  29. if (!LockHelper::lock($lock_name, md5($lock_name), 100, 100)) {
  30. throw new \Exception('获取锁失败');
  31. }
  32. $activity_query = LuckyGroupActivity::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
  33. foreach ($activity_query->batch(200) as $activitys) {
  34. foreach ($activitys as $activity) {
  35. // 成团金额、成团人数、成团期数、失败次数
  36. $group_amounts = $group_peoples = $group_periods = $group_failed_times = 0;
  37. // 累计消耗积分、累计消耗余额
  38. $deplete_balances = $deplete_scores = 0;
  39. // 拼中奖励余额、拼中奖励积分
  40. $win_reward_balances = $win_reward_scores = 0;
  41. $goods = LuckyGroupGoods::find()
  42. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
  43. ->asArray()
  44. ->all();
  45. $goods_ids = array_column($goods, 'goods_id');
  46. // 活动奖期数据
  47. $lottery_period_query = LuckyGroupLotteryPeriod::find()
  48. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
  49. ->asArray();
  50. foreach ($lottery_period_query->batch(200) as $lottery_period_infos) {
  51. if (!empty($lottery_period_infos)) {
  52. $user_ids = array_column($lottery_period_infos, 'user_id');
  53. $group_peoples += count(array_flip(array_flip($user_ids)));
  54. $group_amounts += LuckyGroupOrder::find()
  55. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id, 'goods_id' => $goods_ids, 'is_pay' => 1])
  56. ->sum('money');
  57. $times = [];
  58. $loss_order_id_str = '';
  59. foreach ($lottery_period_infos as $lottery_period_info) {
  60. $times[] = $lottery_period_info['number'];
  61. $loss_order_id_str .= ',' . $lottery_period_info['loss_order_ids'];
  62. }
  63. $group_periods += count(array_flip(array_flip($times)));
  64. $loss_order_ids = explode(',', trim($loss_order_id_str, ','));
  65. $group_failed_times += count(array_filter($loss_order_ids));
  66. }
  67. }
  68. $win_order_id_str = '';
  69. $open_reward_query = LuckyGroupOpenRewardLog::find()
  70. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
  71. ->asArray();
  72. foreach ($open_reward_query->batch(200) as $open_reward_logs) {
  73. if (!empty($open_reward_logs)) {
  74. foreach ($open_reward_logs as $log) {
  75. if ('score' == $log['expend_type']) {
  76. $deplete_scores += $log['expend_num'];
  77. }
  78. if ('balance' == $log['expend_type']) {
  79. $deplete_balances += $log['expend_num'];
  80. }
  81. $win_order_id_str .= $log['win_order_ids'] . ',';
  82. }
  83. }
  84. }
  85. $group_order_query = LuckyGroupOrder::find()
  86. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id, 'goods_id' => $goods_ids, 'is_pay' => 1])
  87. ->asArray();
  88. foreach ($group_order_query->batch(200) as $group_orders) {
  89. $lg_order_ids = array_column($group_orders, 'id');
  90. // 累计拼中奖励余额
  91. $balance_logs = BalanceLog::find()
  92. ->where(['mall_id' => $mall_id, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $lg_order_ids, 'capital_type' => UserWalletEnum::WIN_REWARD])
  93. ->all();
  94. if (!empty($balance_logs)) {
  95. $sub_balances = $add_balances = 0;
  96. foreach ($balance_logs as $balance_log) {
  97. if ('sub' == $balance_log->change_type) {
  98. $sub_balances += $balance_log->change_num;
  99. }
  100. if ('add' == $balance_log->change_type) {
  101. $add_balances += $balance_log->change_num;
  102. }
  103. }
  104. $change_nums = $add_balances - $sub_balances;
  105. $win_reward_balances += $change_nums;
  106. }
  107. // 累计拼中奖励积分
  108. $score_logs = ScoreLog::find()
  109. ->where(['mall_id' => $mall_id, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $lg_order_ids, 'capital_type' => UserWalletEnum::WIN_REWARD])
  110. ->all();
  111. if (!empty($score_logs)) {
  112. $sub_scores = $add_scores = 0;
  113. foreach ($score_logs as $score_log) {
  114. if ('sub' == $score_log->change_type) {
  115. $sub_scores += $score_log->change_num;
  116. }
  117. if ('add' == $score_log->change_type) {
  118. $add_scores += $score_log->change_num;
  119. }
  120. }
  121. $change_nums = $add_scores - $sub_scores;
  122. $win_reward_scores += $change_nums;
  123. }
  124. }
  125. // 更新活动统计表的数据
  126. $params = [
  127. 'mall_id' => $mall_id,
  128. 'activity_id' => $activity->id,
  129. 'group_amounts' => $group_amounts,
  130. 'group_peoples' => $group_peoples,
  131. 'group_periods' => $group_periods,
  132. 'group_failed_times' => $group_failed_times,
  133. 'deplete_balances' => $deplete_balances,
  134. 'deplete_scores' => $deplete_scores,
  135. 'win_reward_balances' => $win_reward_balances,
  136. 'win_reward_scores' => $win_reward_scores,
  137. 'status' => StatusEnum::ENABLED,
  138. ];
  139. $res = LuckyGroupActivityStatistics::setData($mall_id, $params);
  140. if (false === $res) {
  141. throw new \Exception(LuckyGroupActivityStatistics::getStaticError());
  142. }
  143. }
  144. }
  145. LockHelper::uLock($lock_name, md5($lock_name));
  146. return true;
  147. } catch (\Exception $e) {
  148. $msg = '异步统计拼团活动数据任务执行出错:' . $e->getMessage() . ', file: ' . $e->getFile() . ', line: ' . $e->getLine();
  149. \Yii::error($msg);
  150. \Yii::getLogger()->flush(true);
  151. echo $msg . PHP_EOL;
  152. return false;
  153. }
  154. }
  155. }