diff --git a/models/send_tasks_logs.go b/models/send_tasks_logs.go index 81fc4e6..012030b 100644 --- a/models/send_tasks_logs.go +++ b/models/send_tasks_logs.go @@ -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, }) }