argument('activity_id'); $outputDir = $this->option('output'); // 创建输出目录 if (!File::exists($outputDir)) { File::makeDirectory($outputDir, 0755, true); } // 获取活动列表 if ($activityId) { $activities = ActivityConfig::where('id', $activityId)->get(); if ($activities->isEmpty()) { $this->error("活动 ID {$activityId} 不存在"); return 1; } } else { $activities = ActivityConfig::all(); if ($activities->isEmpty()) { $this->info("没有找到任何活动"); return 0; } } $this->info("开始生成 " . count($activities) . " 个活动的报告..."); $timestamp = Carbon::now()->format('YmdHis'); $summaryData = []; foreach ($activities as $activity) { $this->info("正在处理活动: [{$activity->id}] {$activity->name}"); // 收集活动数据 $participantCount = ActivityParticipation::where('activity_id', $activity->id) ->distinct('user_id') ->count('user_id'); $completedCount = ActivityParticipation::where('activity_id', $activity->id) ->where('completion_status', PARTICIPATION_STATUS::COMPLETED) ->count(); $inProgressCount = ActivityParticipation::where('activity_id', $activity->id) ->where('completion_status', PARTICIPATION_STATUS::IN_PROGRESS) ->count(); $failedCount = ActivityParticipation::where('activity_id', $activity->id) ->where('completion_status', PARTICIPATION_STATUS::FAILED) ->count(); $rewardClaimedCount = ActivityParticipation::where('activity_id', $activity->id) ->where('reward_status', REWARD_STATUS::CLAIMED) ->count(); $rewardNotClaimedCount = ActivityParticipation::where('activity_id', $activity->id) ->where('reward_status', REWARD_STATUS::NOT_CLAIMED) ->count(); $rewardExpiredCount = ActivityParticipation::where('activity_id', $activity->id) ->where('reward_status', REWARD_STATUS::EXPIRED) ->count(); // 计算平均进度 $averageProgress = UserActivityData::where('activity_id', $activity->id) ->avg('progress') ?: 0; // 计算完成率 $completionRate = $participantCount > 0 ? round(($completedCount / $participantCount) * 100, 2) : 0; // 计算奖励领取率 $rewardClaimRate = $completedCount > 0 ? round(($rewardClaimedCount / $completedCount) * 100, 2) : 0; // 收集每日参与数据 $dailyParticipations = DB::table('activity_participation') ->select(DB::raw('DATE(participate_time) as date'), DB::raw('COUNT(*) as count')) ->where('activity_id', $activity->id) ->groupBy('date') ->orderBy('date') ->get(); // 收集每日完成数据 $dailyCompletions = DB::table('activity_participation') ->select(DB::raw('DATE(completion_time) as date'), DB::raw('COUNT(*) as count')) ->where('activity_id', $activity->id) ->where('completion_status', PARTICIPATION_STATUS::COMPLETED) ->groupBy('date') ->orderBy('date') ->get(); // 生成报告内容 $reportContent = "# 活动报告: [{$activity->id}] {$activity->name}\n\n"; $reportContent .= "生成时间: " . Carbon::now()->toDateTimeString() . "\n\n"; $reportContent .= "## 活动基本信息\n\n"; $reportContent .= "- 活动ID: {$activity->id}\n"; $reportContent .= "- 活动名称: {$activity->name}\n"; $reportContent .= "- 活动类型: " . \App\Module\Activity\Enums\ACTIVITY_TYPE::getName($activity->type) . "\n"; $reportContent .= "- 开始时间: {$activity->start_time}\n"; $reportContent .= "- 结束时间: {$activity->end_time}\n"; $reportContent .= "- 当前状态: " . ACTIVITY_STATUS::getName($activity->status) . "\n"; $reportContent .= "\n## 参与情况统计\n\n"; $reportContent .= "- 总参与人数: {$participantCount}\n"; $reportContent .= "- 已完成人数: {$completedCount}\n"; $reportContent .= "- 进行中人数: {$inProgressCount}\n"; $reportContent .= "- 已失败人数: {$failedCount}\n"; $reportContent .= "- 完成率: {$completionRate}%\n"; $reportContent .= "- 平均进度: " . round($averageProgress, 2) . "\n"; $reportContent .= "\n## 奖励领取情况\n\n"; $reportContent .= "- 已领取奖励人数: {$rewardClaimedCount}\n"; $reportContent .= "- 未领取奖励人数: {$rewardNotClaimedCount}\n"; $reportContent .= "- 已过期奖励人数: {$rewardExpiredCount}\n"; $reportContent .= "- 奖励领取率: {$rewardClaimRate}%\n"; $reportContent .= "\n## 每日参与人数\n\n"; $reportContent .= "| 日期 | 参与人数 |\n"; $reportContent .= "|------|--------|\n"; foreach ($dailyParticipations as $data) { $reportContent .= "| {$data->date} | {$data->count} |\n"; } $reportContent .= "\n## 每日完成人数\n\n"; $reportContent .= "| 日期 | 完成人数 |\n"; $reportContent .= "|------|--------|\n"; foreach ($dailyCompletions as $data) { $reportContent .= "| {$data->date} | {$data->count} |\n"; } // 保存报告文件 $filename = "activity_{$activity->id}_report_{$timestamp}.md"; $filePath = "{$outputDir}/{$filename}"; File::put($filePath, $reportContent); $this->info("活动报告已保存到: {$filePath}"); // 收集汇总数据 $summaryData[] = [ 'id' => $activity->id, 'name' => $activity->name, 'status' => ACTIVITY_STATUS::getName($activity->status), 'participants' => $participantCount, 'completed' => $completedCount, 'completion_rate' => $completionRate . '%', 'rewards_claimed' => $rewardClaimedCount, 'claim_rate' => $rewardClaimRate . '%' ]; } // 生成汇总报告 if (count($activities) > 1) { $summaryContent = "# 活动汇总报告\n\n"; $summaryContent .= "生成时间: " . Carbon::now()->toDateTimeString() . "\n\n"; $summaryContent .= "## 活动列表\n\n"; $summaryContent .= "| ID | 活动名称 | 状态 | 参与人数 | 完成人数 | 完成率 | 领取奖励人数 | 领取率 |\n"; $summaryContent .= "|----|---------|----|--------|--------|-------|------------|-------|\n"; foreach ($summaryData as $data) { $summaryContent .= "| {$data['id']} | {$data['name']} | {$data['status']} | {$data['participants']} | {$data['completed']} | {$data['completion_rate']} | {$data['rewards_claimed']} | {$data['claim_rate']} |\n"; } // 保存汇总报告 $summaryFilename = "activity_summary_report_{$timestamp}.md"; $summaryFilePath = "{$outputDir}/{$summaryFilename}"; File::put($summaryFilePath, $summaryContent); $this->info("汇总报告已保存到: {$summaryFilePath}"); } $this->info("活动报告生成完成"); return 0; } }