From 8c7390e5f80e1568c1bc2f86b4eebf4836e9af29 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 15:34:19 +0800 Subject: [PATCH] fix: docs docker depoly desc --- docs/deployment/docker-compose.md | 6 ++ docs/deployment/docker.md | 6 ++ models/send_tasks_logs.go | 121 ++++++++++++++++++++++-------- 3 files changed, 101 insertions(+), 32 deletions(-) diff --git a/docs/deployment/docker-compose.md b/docs/deployment/docker-compose.md index 7986dbd..2b6dbf7 100644 --- a/docs/deployment/docker-compose.md +++ b/docs/deployment/docker-compose.md @@ -53,6 +53,10 @@ docker-compose up -d ### 使用 MySQL +::: warning 重要 +使用 MySQL 时必须指定 `DB_TYPE=mysql` 环境变量,否则会默认使用 SQLite。 +::: + 创建 `docker-compose.yml`: ```yaml @@ -68,6 +72,7 @@ services: ports: - "8000:8000" environment: + - DB_TYPE=mysql - MYSQL_HOST=192.168.64.133 - MYSQL_PORT=3308 - MYSQL_USER=root @@ -134,6 +139,7 @@ services: ports: - "8000:8000" environment: + - DB_TYPE=mysql - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USER=root diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index c91b42c..131c937 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -114,10 +114,15 @@ docker run -d \ ### 使用 MySQL +::: warning 重要 +使用 MySQL 时必须指定 `DB_TYPE=mysql` 环境变量,否则会默认使用 SQLite。 +::: + ```bash # 正式运行(GHCR 镜像,推荐) docker run -d \ -p 8000:8000 \ + -e DB_TYPE=mysql \ -e MYSQL_HOST=192.168.64.133 \ -e MYSQL_PORT=3308 \ -e MYSQL_USER=root \ @@ -130,6 +135,7 @@ docker run -d \ # 或使用 Docker Hub 镜像 docker run -d \ -p 8000:8000 \ + -e DB_TYPE=mysql \ -e MYSQL_HOST=192.168.64.133 \ -e MYSQL_PORT=3308 \ -e MYSQL_USER=root \ diff --git a/models/send_tasks_logs.go b/models/send_tasks_logs.go index 96e3a4f..09eeb13 100644 --- a/models/send_tasks_logs.go +++ b/models/send_tasks_logs.go @@ -354,56 +354,108 @@ func GetChannelStatisticData() (ChannelStatisticData, error) { insTable := GetSchema(SendTasksIns{}) waysTable := GetSchema(SendWays{}) - // 第一步:从 send_stats 表统计每个任务的执行次数 + // 第一步:从 send_stats 表统计每个任务的执行次数(按任务类型分组) var taskStats []struct { - TaskID string - Num int64 + TaskID string + TaskType string + Num int64 } - db. + err := db. Table(statsTable). - Select("task_id, SUM(num) AS num"). - Where("task_id != ''"). // 排除全局统计 - Group("task_id"). - Scan(&taskStats) + Select("task_id, task_type, SUM(num) AS num"). + Where("task_id != '' AND task_id IS NOT NULL"). // 排除全局统计和空值 + Group("task_id, task_type"). + Scan(&taskStats).Error + if err != nil { + fmt.Printf("[DEBUG] 查询 send_stats 表失败: %v\n", err) + return statistic, err + } + + fmt.Printf("[DEBUG] send_stats 查询结果: %+v\n", taskStats) + + // 如果没有任务统计数据,返回空数组而不是 nil if len(taskStats) == 0 { - statistic.WayCateData = wayCateData + fmt.Println("[DEBUG] send_stats 表中没有任务统计数据") + statistic.WayCateData = []WayCateData{} return statistic, nil } - // 第二步:收集所有任务ID - taskIDs := make([]string, 0, len(taskStats)) - taskNumMap := make(map[string]int64) + // 第二步:分别收集任务ID和模板ID + taskIDs := make([]string, 0) + templateIDs := make([]string, 0) + taskNumMap := make(map[string]int64) // key: task_id 或 template_id + for _, stat := range taskStats { - taskIDs = append(taskIDs, stat.TaskID) + if stat.TaskType == "template" { + templateIDs = append(templateIDs, stat.TaskID) + } else { + taskIDs = append(taskIDs, stat.TaskID) + } taskNumMap[stat.TaskID] = stat.Num } - // 第三步:查询这些任务关联的渠道信息 - var taskWays []struct { - TaskID string - WayID string - WayName string - } + fmt.Printf("[DEBUG] 任务IDs: %+v, 模板IDs: %+v\n", taskIDs, templateIDs) - db. - Table(insTable). - Select(fmt.Sprintf("%s.task_id, %s.way_id, %s.name as way_name", insTable, insTable, waysTable)). - Joins(fmt.Sprintf("JOIN %s ON %s.way_id = %s.id", waysTable, insTable, waysTable)). - Where(fmt.Sprintf("%s.task_id IN ?", insTable), taskIDs). - Group(fmt.Sprintf("%s.task_id, %s.way_id, %s.name", insTable, insTable, waysTable)). - Scan(&taskWays) - - // 第四步:按渠道聚合统计 + // 第三步:查询渠道信息(分别查询任务和模板) wayCountMap := make(map[string]int64) - for _, tw := range taskWays { - if num, exists := taskNumMap[tw.TaskID]; exists { - wayCountMap[tw.WayName] += num + + // 查询任务关联的渠道 + if len(taskIDs) > 0 { + var taskWays []struct { + TaskID string + WayName string + } + + err = db. + Table(insTable). + Select(fmt.Sprintf("%s.task_id, %s.name as way_name", insTable, waysTable)). + Joins(fmt.Sprintf("JOIN %s ON %s.way_id = %s.id", waysTable, insTable, waysTable)). + Where(fmt.Sprintf("%s.task_id IN ?", insTable), taskIDs). + Scan(&taskWays).Error + + if err != nil { + fmt.Printf("[DEBUG] 查询任务渠道关联失败: %v\n", err) + } else { + fmt.Printf("[DEBUG] 任务渠道关联查询结果: %+v\n", taskWays) + for _, tw := range taskWays { + if num, exists := taskNumMap[tw.TaskID]; exists { + wayCountMap[tw.WayName] += num + } + } } } - // 第五步:转换为返回格式 + // 查询模板关联的渠道 + if len(templateIDs) > 0 { + var templateWays []struct { + TemplateID string + WayName string + } + + err = db. + Table(insTable). + Select(fmt.Sprintf("%s.template_id, %s.name as way_name", insTable, waysTable)). + Joins(fmt.Sprintf("JOIN %s ON %s.way_id = %s.id", waysTable, insTable, waysTable)). + Where(fmt.Sprintf("%s.template_id IN ?", insTable), templateIDs). + Scan(&templateWays).Error + + if err != nil { + fmt.Printf("[DEBUG] 查询模板渠道关联失败: %v\n", err) + } else { + fmt.Printf("[DEBUG] 模板渠道关联查询结果: %+v\n", templateWays) + for _, tw := range templateWays { + if num, exists := taskNumMap[tw.TemplateID]; exists { + wayCountMap[tw.WayName] += num + } + } + } + } + + fmt.Printf("[DEBUG] 渠道统计结果: %+v\n", wayCountMap) + + // 第四步:转换为返回格式 for wayName, count := range wayCountMap { wayCateData = append(wayCateData, WayCateData{ WayName: wayName, @@ -411,6 +463,11 @@ func GetChannelStatisticData() (ChannelStatisticData, error) { }) } + // 确保返回空数组而不是 nil + if len(wayCateData) == 0 { + wayCateData = []WayCateData{} + } + statistic.WayCateData = wayCateData return statistic, nil }