fix: send channels static
This commit is contained in:
+13
-84
@@ -350,102 +350,31 @@ func GetTrendStatisticData() (TrendStatisticData, error) {
|
|||||||
func GetChannelStatisticData() (ChannelStatisticData, error) {
|
func GetChannelStatisticData() (ChannelStatisticData, error) {
|
||||||
var statistic ChannelStatisticData
|
var statistic ChannelStatisticData
|
||||||
var wayCateData []WayCateData
|
var wayCateData []WayCateData
|
||||||
statsTable := GetSchema(SendStats{})
|
|
||||||
insTable := GetSchema(SendTasksIns{})
|
insTable := GetSchema(SendTasksIns{})
|
||||||
waysTable := GetSchema(SendWays{})
|
waysTable := GetSchema(SendWays{})
|
||||||
|
|
||||||
// 第一步:从 send_stats 表统计每个任务的执行次数(按任务类型分组)
|
// 统计所有任务和模板中关联的实例的渠道数据
|
||||||
var taskStats []struct {
|
var wayStats []struct {
|
||||||
TaskID string
|
WayName string
|
||||||
TaskType string
|
CountNum int
|
||||||
Num int64
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := db.
|
err := db.
|
||||||
Table(statsTable).
|
Table(insTable).
|
||||||
Select("task_id, task_type, SUM(num) AS num").
|
Select(fmt.Sprintf("%s.name as way_name, COUNT(*) as count_num", waysTable)).
|
||||||
Where("task_id != '' AND task_id IS NOT NULL"). // 排除全局统计和空值
|
Joins(fmt.Sprintf("JOIN %s ON %s.way_id = %s.id", waysTable, insTable, waysTable)).
|
||||||
Group("task_id, task_type").
|
Group(fmt.Sprintf("%s.name", waysTable)).
|
||||||
Scan(&taskStats).Error
|
Scan(&wayStats).Error
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return statistic, err
|
return statistic, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有任务统计数据,返回空数组而不是 nil
|
// 转换为返回格式
|
||||||
if len(taskStats) == 0 {
|
for _, stat := range wayStats {
|
||||||
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 {
|
|
||||||
wayCateData = append(wayCateData, WayCateData{
|
wayCateData = append(wayCateData, WayCateData{
|
||||||
WayName: wayName,
|
WayName: stat.WayName,
|
||||||
CountNum: int(count),
|
CountNum: stat.CountNum,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user