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; } } }