| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <?php
- namespace App\Module\Activity\Commands;
- use App\Module\Activity\Enums\ACTIVITY_STATUS;
- use App\Module\Activity\Enums\PARTICIPATION_STATUS;
- use App\Module\Activity\Enums\REWARD_STATUS;
- use App\Module\Activity\Models\ActivityConfig;
- use App\Module\Activity\Models\ActivityParticipation;
- use App\Module\Activity\Models\UserActivityData;
- use Carbon\Carbon;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\File;
- /**
- * 生成活动报告命令
- */
- class GenerateActivityReportCommand extends Command
- {
- /**
- * 命令名称
- *
- * @var string
- */
- protected $signature = 'activity:report {activity_id? : 活动ID,不指定则生成所有活动的报告} {--output=storage/activity_reports : 报告输出目录}';
- /**
- * 命令描述
- *
- * @var string
- */
- protected $description = '生成活动参与和完成情况报告';
- /**
- * 执行命令
- *
- * @return int
- */
- public function handle()
- {
- $activityId = $this->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;
- }
- }
|