| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <?php
- namespace addons\LuckyGroup\common\logic\statistics;
- use addons\LuckyGroup\common\models\LuckyGroupActivity;
- use addons\LuckyGroup\common\models\LuckyGroupActivityStatistics;
- use addons\LuckyGroup\common\models\LuckyGroupCommissionLog;
- use addons\LuckyGroup\common\models\LuckyGroupGoods;
- use addons\LuckyGroup\common\models\LuckyGroupLotteryPeriod;
- use addons\LuckyGroup\common\models\LuckyGroupOpenRewardLog;
- use addons\LuckyGroup\common\models\LuckyGroupOrder;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\LockHelper;
- use common\models\common\BalanceLog;
- use common\models\common\ScoreLog;
- use common\traits\ErrorTrait;
- class StatisticsLogic
- {
- use ErrorTrait;
- /**
- * @name:
- * @msg: 拼团活动数据统计
- * @param {int} $mall_id
- * @return {*}
- */
- public static function asyncStatisticsActivityData(int $mall_id)
- {
- try {
- $lock_name = 'LuckyGroup:activity-data-statistics-look:mall_id:' . $mall_id;
- if (!LockHelper::lock($lock_name, md5($lock_name), 100, 100)) {
- throw new \Exception('获取锁失败');
- }
- $activity_query = LuckyGroupActivity::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
- foreach ($activity_query->batch(200) as $activitys) {
- foreach ($activitys as $activity) {
- // 成团金额、成团人数、成团期数、失败次数
- $group_amounts = $group_peoples = $group_periods = $group_failed_times = 0;
- // 累计消耗积分、累计消耗余额
- $deplete_balances = $deplete_scores = 0;
- // 拼中奖励余额、拼中奖励积分
- $win_reward_balances = $win_reward_scores = 0;
- $goods = LuckyGroupGoods::find()
- ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
- ->asArray()
- ->all();
- $goods_ids = array_column($goods, 'goods_id');
- // 活动奖期数据
- $lottery_period_query = LuckyGroupLotteryPeriod::find()
- ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
- ->asArray();
- foreach ($lottery_period_query->batch(200) as $lottery_period_infos) {
- if (!empty($lottery_period_infos)) {
- $user_ids = array_column($lottery_period_infos, 'user_id');
- $group_peoples += count(array_flip(array_flip($user_ids)));
- $group_amounts += LuckyGroupOrder::find()
- ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id, 'goods_id' => $goods_ids, 'is_pay' => 1])
- ->sum('money');
- $times = [];
- $loss_order_id_str = '';
- foreach ($lottery_period_infos as $lottery_period_info) {
- $times[] = $lottery_period_info['number'];
- $loss_order_id_str .= ',' . $lottery_period_info['loss_order_ids'];
- }
- $group_periods += count(array_flip(array_flip($times)));
- $loss_order_ids = explode(',', trim($loss_order_id_str, ','));
- $group_failed_times += count(array_filter($loss_order_ids));
- }
- }
- $win_order_id_str = '';
- $open_reward_query = LuckyGroupOpenRewardLog::find()
- ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id])
- ->asArray();
- foreach ($open_reward_query->batch(200) as $open_reward_logs) {
- if (!empty($open_reward_logs)) {
- foreach ($open_reward_logs as $log) {
- if ('score' == $log['expend_type']) {
- $deplete_scores += $log['expend_num'];
- }
- if ('balance' == $log['expend_type']) {
- $deplete_balances += $log['expend_num'];
- }
- $win_order_id_str .= $log['win_order_ids'] . ',';
- }
- }
- }
- $group_order_query = LuckyGroupOrder::find()
- ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity->id, 'goods_id' => $goods_ids, 'is_pay' => 1])
- ->asArray();
- foreach ($group_order_query->batch(200) as $group_orders) {
- $lg_order_ids = array_column($group_orders, 'id');
- // 累计拼中奖励余额
- $balance_logs = BalanceLog::find()
- ->where(['mall_id' => $mall_id, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $lg_order_ids, 'capital_type' => UserWalletEnum::WIN_REWARD])
- ->all();
- if (!empty($balance_logs)) {
- $sub_balances = $add_balances = 0;
- foreach ($balance_logs as $balance_log) {
- if ('sub' == $balance_log->change_type) {
- $sub_balances += $balance_log->change_num;
- }
- if ('add' == $balance_log->change_type) {
- $add_balances += $balance_log->change_num;
- }
- }
- $change_nums = $add_balances - $sub_balances;
- $win_reward_balances += $change_nums;
- }
- // 累计拼中奖励积分
- $score_logs = ScoreLog::find()
- ->where(['mall_id' => $mall_id, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $lg_order_ids, 'capital_type' => UserWalletEnum::WIN_REWARD])
- ->all();
- if (!empty($score_logs)) {
- $sub_scores = $add_scores = 0;
- foreach ($score_logs as $score_log) {
- if ('sub' == $score_log->change_type) {
- $sub_scores += $score_log->change_num;
- }
- if ('add' == $score_log->change_type) {
- $add_scores += $score_log->change_num;
- }
- }
- $change_nums = $add_scores - $sub_scores;
- $win_reward_scores += $change_nums;
- }
- }
- // 更新活动统计表的数据
- $params = [
- 'mall_id' => $mall_id,
- 'activity_id' => $activity->id,
- 'group_amounts' => $group_amounts,
- 'group_peoples' => $group_peoples,
- 'group_periods' => $group_periods,
- 'group_failed_times' => $group_failed_times,
- 'deplete_balances' => $deplete_balances,
- 'deplete_scores' => $deplete_scores,
- 'win_reward_balances' => $win_reward_balances,
- 'win_reward_scores' => $win_reward_scores,
- 'status' => StatusEnum::ENABLED,
- ];
- $res = LuckyGroupActivityStatistics::setData($mall_id, $params);
- if (false === $res) {
- throw new \Exception(LuckyGroupActivityStatistics::getStaticError());
- }
- }
- }
- LockHelper::uLock($lock_name, md5($lock_name));
- return true;
- } catch (\Exception $e) {
- $msg = '异步统计拼团活动数据任务执行出错:' . $e->getMessage() . ', file: ' . $e->getFile() . ', line: ' . $e->getLine();
- \Yii::error($msg);
- \Yii::getLogger()->flush(true);
- echo $msg . PHP_EOL;
- return false;
- }
- }
- }
|