fix: docs docker depoly desc
This commit is contained in:
@@ -53,6 +53,10 @@ docker-compose up -d
|
|||||||
|
|
||||||
### 使用 MySQL
|
### 使用 MySQL
|
||||||
|
|
||||||
|
::: warning 重要
|
||||||
|
使用 MySQL 时必须指定 `DB_TYPE=mysql` 环境变量,否则会默认使用 SQLite。
|
||||||
|
:::
|
||||||
|
|
||||||
创建 `docker-compose.yml`:
|
创建 `docker-compose.yml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -68,6 +72,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
environment:
|
environment:
|
||||||
|
- DB_TYPE=mysql
|
||||||
- MYSQL_HOST=192.168.64.133
|
- MYSQL_HOST=192.168.64.133
|
||||||
- MYSQL_PORT=3308
|
- MYSQL_PORT=3308
|
||||||
- MYSQL_USER=root
|
- MYSQL_USER=root
|
||||||
@@ -134,6 +139,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
environment:
|
environment:
|
||||||
|
- DB_TYPE=mysql
|
||||||
- MYSQL_HOST=mysql
|
- MYSQL_HOST=mysql
|
||||||
- MYSQL_PORT=3306
|
- MYSQL_PORT=3306
|
||||||
- MYSQL_USER=root
|
- MYSQL_USER=root
|
||||||
|
|||||||
@@ -114,10 +114,15 @@ docker run -d \
|
|||||||
|
|
||||||
### 使用 MySQL
|
### 使用 MySQL
|
||||||
|
|
||||||
|
::: warning 重要
|
||||||
|
使用 MySQL 时必须指定 `DB_TYPE=mysql` 环境变量,否则会默认使用 SQLite。
|
||||||
|
:::
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 正式运行(GHCR 镜像,推荐)
|
# 正式运行(GHCR 镜像,推荐)
|
||||||
docker run -d \
|
docker run -d \
|
||||||
-p 8000:8000 \
|
-p 8000:8000 \
|
||||||
|
-e DB_TYPE=mysql \
|
||||||
-e MYSQL_HOST=192.168.64.133 \
|
-e MYSQL_HOST=192.168.64.133 \
|
||||||
-e MYSQL_PORT=3308 \
|
-e MYSQL_PORT=3308 \
|
||||||
-e MYSQL_USER=root \
|
-e MYSQL_USER=root \
|
||||||
@@ -130,6 +135,7 @@ docker run -d \
|
|||||||
# 或使用 Docker Hub 镜像
|
# 或使用 Docker Hub 镜像
|
||||||
docker run -d \
|
docker run -d \
|
||||||
-p 8000:8000 \
|
-p 8000:8000 \
|
||||||
|
-e DB_TYPE=mysql \
|
||||||
-e MYSQL_HOST=192.168.64.133 \
|
-e MYSQL_HOST=192.168.64.133 \
|
||||||
-e MYSQL_PORT=3308 \
|
-e MYSQL_PORT=3308 \
|
||||||
-e MYSQL_USER=root \
|
-e MYSQL_USER=root \
|
||||||
|
|||||||
+89
-32
@@ -354,56 +354,108 @@ func GetChannelStatisticData() (ChannelStatisticData, error) {
|
|||||||
insTable := GetSchema(SendTasksIns{})
|
insTable := GetSchema(SendTasksIns{})
|
||||||
waysTable := GetSchema(SendWays{})
|
waysTable := GetSchema(SendWays{})
|
||||||
|
|
||||||
// 第一步:从 send_stats 表统计每个任务的执行次数
|
// 第一步:从 send_stats 表统计每个任务的执行次数(按任务类型分组)
|
||||||
var taskStats []struct {
|
var taskStats []struct {
|
||||||
TaskID string
|
TaskID string
|
||||||
Num int64
|
TaskType string
|
||||||
|
Num int64
|
||||||
}
|
}
|
||||||
|
|
||||||
db.
|
err := db.
|
||||||
Table(statsTable).
|
Table(statsTable).
|
||||||
Select("task_id, SUM(num) AS num").
|
Select("task_id, task_type, SUM(num) AS num").
|
||||||
Where("task_id != ''"). // 排除全局统计
|
Where("task_id != '' AND task_id IS NOT NULL"). // 排除全局统计和空值
|
||||||
Group("task_id").
|
Group("task_id, task_type").
|
||||||
Scan(&taskStats)
|
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 {
|
if len(taskStats) == 0 {
|
||||||
statistic.WayCateData = wayCateData
|
fmt.Println("[DEBUG] send_stats 表中没有任务统计数据")
|
||||||
|
statistic.WayCateData = []WayCateData{}
|
||||||
return statistic, nil
|
return statistic, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第二步:收集所有任务ID
|
// 第二步:分别收集任务ID和模板ID
|
||||||
taskIDs := make([]string, 0, len(taskStats))
|
taskIDs := make([]string, 0)
|
||||||
taskNumMap := make(map[string]int64)
|
templateIDs := make([]string, 0)
|
||||||
|
taskNumMap := make(map[string]int64) // key: task_id 或 template_id
|
||||||
|
|
||||||
for _, stat := range taskStats {
|
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
|
taskNumMap[stat.TaskID] = stat.Num
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第三步:查询这些任务关联的渠道信息
|
fmt.Printf("[DEBUG] 任务IDs: %+v, 模板IDs: %+v\n", taskIDs, templateIDs)
|
||||||
var taskWays []struct {
|
|
||||||
TaskID string
|
|
||||||
WayID string
|
|
||||||
WayName string
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
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 {
|
for wayName, count := range wayCountMap {
|
||||||
wayCateData = append(wayCateData, WayCateData{
|
wayCateData = append(wayCateData, WayCateData{
|
||||||
WayName: wayName,
|
WayName: wayName,
|
||||||
@@ -411,6 +463,11 @@ func GetChannelStatisticData() (ChannelStatisticData, error) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 确保返回空数组而不是 nil
|
||||||
|
if len(wayCateData) == 0 {
|
||||||
|
wayCateData = []WayCateData{}
|
||||||
|
}
|
||||||
|
|
||||||
statistic.WayCateData = wayCateData
|
statistic.WayCateData = wayCateData
|
||||||
return statistic, nil
|
return statistic, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user