fix: send channels static
This commit is contained in:
+13
-84
@@ -350,102 +350,31 @@ func GetTrendStatisticData() (TrendStatisticData, error) {
|
||||
func GetChannelStatisticData() (ChannelStatisticData, error) {
|
||||
var statistic ChannelStatisticData
|
||||
var wayCateData []WayCateData
|
||||
statsTable := GetSchema(SendStats{})
|
||||
insTable := GetSchema(SendTasksIns{})
|
||||
waysTable := GetSchema(SendWays{})
|
||||
|
||||
// 第一步:从 send_stats 表统计每个任务的执行次数(按任务类型分组)
|
||||
var taskStats []struct {
|
||||
TaskID string
|
||||
TaskType string
|
||||
Num int64
|
||||
// 统计所有任务和模板中关联的实例的渠道数据
|
||||
var wayStats []struct {
|
||||
WayName string
|
||||
CountNum int
|
||||
}
|
||||
|
||||
err := db.
|
||||
Table(statsTable).
|
||||
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
|
||||
Table(insTable).
|
||||
Select(fmt.Sprintf("%s.name as way_name, COUNT(*) as count_num", waysTable)).
|
||||
Joins(fmt.Sprintf("JOIN %s ON %s.way_id = %s.id", waysTable, insTable, waysTable)).
|
||||
Group(fmt.Sprintf("%s.name", waysTable)).
|
||||
Scan(&wayStats).Error
|
||||
|
||||
if err != nil {
|
||||
return statistic, err
|
||||
}
|
||||
|
||||
// 如果没有任务统计数据,返回空数组而不是 nil
|
||||
if len(taskStats) == 0 {
|
||||
statistic.WayCateData = []WayCateData{}
|
||||
return statistic, nil
|
||||
}
|
||||
|
||||
// 第二步:分别收集任务ID和模板ID
|
||||
taskIDs := make([]string, 0)
|
||||
templateIDs := make([]string, 0)
|
||||
taskNumMap := make(map[string]int64) // key: task_id 或 template_id
|
||||
|
||||
for _, stat := range taskStats {
|
||||
if stat.TaskType == "template" {
|
||||
templateIDs = append(templateIDs, stat.TaskID)
|
||||
} else {
|
||||
taskIDs = append(taskIDs, stat.TaskID)
|
||||
}
|
||||
taskNumMap[stat.TaskID] = stat.Num
|
||||
}
|
||||
|
||||
// 第三步:查询渠道信息(分别查询任务和模板)
|
||||
wayCountMap := make(map[string]int64)
|
||||
|
||||
// 查询任务关联的渠道
|
||||
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 {
|
||||
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 {
|
||||
for _, tw := range templateWays {
|
||||
if num, exists := taskNumMap[tw.TemplateID]; exists {
|
||||
wayCountMap[tw.WayName] += num
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 第四步:转换为返回格式
|
||||
for wayName, count := range wayCountMap {
|
||||
// 转换为返回格式
|
||||
for _, stat := range wayStats {
|
||||
wayCateData = append(wayCateData, WayCateData{
|
||||
WayName: wayName,
|
||||
CountNum: int(count),
|
||||
WayName: stat.WayName,
|
||||
CountNum: stat.CountNum,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user