|
|
@@ -2,558 +2,550 @@ package fwhQueue
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "fwh-toolbox-server/cache"
|
|
|
"fwh-toolbox-server/domain"
|
|
|
"fwh-toolbox-server/dto"
|
|
|
"fwh-toolbox-server/jobs"
|
|
|
- "fwh-toolbox-server/logger"
|
|
|
"fwh-toolbox-server/repositories"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
|
+ "github.com/hibiken/asynq"
|
|
|
"go.uber.org/zap"
|
|
|
)
|
|
|
|
|
|
-var (
|
|
|
- TaskTypeBatchDownload = "task_BatchDownload"
|
|
|
-)
|
|
|
+// handleBatchDownload 是 BatchDownload 主任务的 Asynq handler
|
|
|
+func handleBatchDownload(ctx context.Context, task *asynq.Task) error {
|
|
|
+ var payload domain.TaskBatchDownload
|
|
|
+ if err := json.Unmarshal(task.Payload(), &payload); err != nil {
|
|
|
+ return fmt.Errorf("unmarshal BatchDownload payload: %w", err)
|
|
|
+ }
|
|
|
|
|
|
-// type TaskBatchDownload = types.TaskBatchDownload
|
|
|
+ mainTaskId := payload.Id.Hex()
|
|
|
|
|
|
-func handleTaskBatchDownload(ctx context.Context, payload domain.TaskBatchDownload) error {
|
|
|
// 更新运行状态
|
|
|
- fmt.Println("更新任务运行状态")
|
|
|
- if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressRunning, []string{}); repoErr != nil {
|
|
|
- zap.L().Error("更新批量数据下载结果状态失败(Running)", zap.String("id", payload.Id.String()))
|
|
|
- return repoErr
|
|
|
+ if err := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressRunning, []string{}); err != nil {
|
|
|
+ zap.L().Error("[BatchDownload] 更新状态失败(Running)", zap.String("id", mainTaskId))
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
- fmt.Printf("开始执行任务 %v\n", payload)
|
|
|
- reasons, err := executeTaskBatchDownload(ctx, payload)
|
|
|
- // 记录任务执行结果
|
|
|
+ // 执行主逻辑
|
|
|
+ reasons, err := executeBatchDownload(ctx, payload)
|
|
|
+
|
|
|
+ // 记录结果
|
|
|
if err != nil {
|
|
|
- fmt.Printf("任务执行失败 %s\n", err.Error())
|
|
|
- if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressError, []string{err.Error()}); repoErr != nil {
|
|
|
- zap.L().Error("更新批量数据下载结果状态失败(Error)", zap.String("id", payload.Id.String()))
|
|
|
- return repoErr
|
|
|
- }
|
|
|
+ zap.L().Error("[BatchDownload] 任务执行失败", zap.String("id", mainTaskId), zap.String("err", err.Error()))
|
|
|
+ repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressError, []string{err.Error()})
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(reasons) == 0 {
|
|
|
+ zap.L().Info("[BatchDownload] 任务执行成功", zap.String("id", mainTaskId))
|
|
|
+ repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressComplete, []string{})
|
|
|
} else {
|
|
|
- if len(reasons) == 0 {
|
|
|
- fmt.Println("任务执行成功")
|
|
|
- if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressComplete, []string{}); repoErr != nil {
|
|
|
- zap.L().Error("更新批量数据下载结果状态失败(Complete)", zap.String("id", payload.Id.String()), zap.String("err", repoErr.Error()))
|
|
|
- return repoErr
|
|
|
- }
|
|
|
- } else {
|
|
|
- fmt.Println("任务执行失败")
|
|
|
- if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressFailed, reasons); repoErr != nil {
|
|
|
- zap.L().Error("更新批量数据下载结果状态失败(Complete)", zap.String("id", payload.Id.String()), zap.String("err", repoErr.Error()))
|
|
|
- return repoErr
|
|
|
- }
|
|
|
- }
|
|
|
+ zap.L().Warn("[BatchDownload] 任务部分失败", zap.String("id", mainTaskId), zap.Strings("reasons", reasons))
|
|
|
+ repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressFailed, reasons)
|
|
|
}
|
|
|
|
|
|
- return err
|
|
|
+ return nil // 返回 nil 让 Asynq 标记任务为 completed,不触发重试
|
|
|
}
|
|
|
|
|
|
-var executeTaskBatchDownload = func(ctx context.Context, payload domain.TaskBatchDownload) ([]string, error) {
|
|
|
- // 转换时间范围,只取用日期部分
|
|
|
+// executeBatchDownload 执行批量下载逻辑
|
|
|
+func executeBatchDownload(ctx context.Context, payload domain.TaskBatchDownload) ([]string, error) {
|
|
|
+ mainTaskId := payload.Id.Hex()
|
|
|
+
|
|
|
+ // 解析时间范围
|
|
|
startTime, err := time.Parse(time.DateOnly, payload.TimePeriod[0])
|
|
|
if err != nil {
|
|
|
- zap.L().Error("StartTime 格式错误", zap.String("time", payload.TimePeriod[0]), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return nil, fmt.Errorf("startTime 格式错误: %w", err)
|
|
|
}
|
|
|
endTime, err := time.Parse(time.DateOnly, payload.TimePeriod[1])
|
|
|
if err != nil {
|
|
|
- zap.L().Error("EndTime 格式错误", zap.String("time", payload.TimePeriod[1]), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return nil, fmt.Errorf("endTime 格式错误: %w", err)
|
|
|
}
|
|
|
-
|
|
|
- // 将 endTime 调整到当天的 23:59:59
|
|
|
endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
|
|
|
-
|
|
|
- // 保证 startTime <= endTime
|
|
|
if startTime.After(endTime) {
|
|
|
return nil, errors.New("startTime > endTime")
|
|
|
}
|
|
|
|
|
|
// 按天拆分时间段
|
|
|
- var periods []struct{ Start, End time.Time }
|
|
|
- currTime := startTime
|
|
|
- for currTime.Before(endTime) {
|
|
|
- // 当天结束时间
|
|
|
- dayEnd := time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 23, 59, 59, 0, currTime.Location())
|
|
|
-
|
|
|
- // 如果当天结束大于 endTime,使用 endTime
|
|
|
- if dayEnd.After(endTime) {
|
|
|
- dayEnd = endTime
|
|
|
+ periods := splitTimePeriods(startTime, endTime)
|
|
|
+
|
|
|
+ // ==================== 阶段1:创建文件下载子任务 ====================
|
|
|
+ callFileTasks := buildCallFileTasks(payload, periods, startTime, endTime)
|
|
|
+ totalSubTasks := len(callFileTasks)
|
|
|
+
|
|
|
+ if totalSubTasks > 0 {
|
|
|
+ // 初始化 Redis 计数器(待完成数)
|
|
|
+ counterKey := callFileCounterPrefix + mainTaskId
|
|
|
+ failuresKey := callFileFailuresPrefix + mainTaskId
|
|
|
+
|
|
|
+ cache.Set(ctx, counterKey, totalSubTasks, 2*time.Hour)
|
|
|
+ cache.Delete(ctx, failuresKey)
|
|
|
+
|
|
|
+ // 入队所有子任务
|
|
|
+ for i, cfTask := range callFileTasks {
|
|
|
+ taskPayload, _ := json.Marshal(cfTask)
|
|
|
+ subTaskID := fmt.Sprintf("callfile-%s-%d", mainTaskId, i)
|
|
|
+ t := asynq.NewTask(TaskTypeCallFile, taskPayload,
|
|
|
+ asynq.MaxRetry(3),
|
|
|
+ asynq.Timeout(35*time.Minute),
|
|
|
+ asynq.Queue(QueueDownload),
|
|
|
+ asynq.TaskID(subTaskID),
|
|
|
+ )
|
|
|
+ if _, err := TaskClient.Enqueue(t); err != nil {
|
|
|
+ zap.L().Error("[BatchDownload] 子任务入队失败",
|
|
|
+ zap.String("id", mainTaskId),
|
|
|
+ zap.Int("index", i),
|
|
|
+ zap.String("err", err.Error()),
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- periods = append(periods, struct{ Start, End time.Time }{Start: currTime, End: dayEnd})
|
|
|
+ // ==================== 阶段2:同步处理其他数据任务 ====================
|
|
|
+ if err := executeSyncTasks(ctx, payload, periods); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
- // 下一天开始
|
|
|
- currTime = dayEnd.Add(time.Second).Truncate(24 * time.Hour)
|
|
|
- currTime = time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 0, 0, 0, 0, currTime.Location())
|
|
|
+ // ==================== 阶段3:等待子任务完成 ====================
|
|
|
+ if totalSubTasks > 0 {
|
|
|
+ failReasons, err := waitForCallFileTasks(ctx, mainTaskId)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return failReasons, nil
|
|
|
}
|
|
|
|
|
|
- fmt.Println(payload.Options)
|
|
|
+ return nil, nil
|
|
|
+}
|
|
|
+
|
|
|
+// callFilePayload 是传递给子任务的 payload 结构
|
|
|
+type callFilePayload struct {
|
|
|
+ MainTaskId string `json:"mainTaskId"`
|
|
|
+ TaskInfo domain.BatchDownloadFileTaskInfo `json:"taskInfo"`
|
|
|
+}
|
|
|
+
|
|
|
+// buildCallFileTasks 构建所有需要异步下载的文件任务列表
|
|
|
+func buildCallFileTasks(payload domain.TaskBatchDownload, periods []timePeriod, startTime, endTime time.Time) []callFilePayload {
|
|
|
+ mainTaskId := payload.Id.Hex()
|
|
|
+ var tasks []callFilePayload
|
|
|
|
|
|
- // 优先处理文件下载任务(并行处理缩短时间)
|
|
|
- downloadList := []domain.BatchDownloadFileTaskInfo{}
|
|
|
for _, sn := range payload.Sn {
|
|
|
+ // EmsLog 任务
|
|
|
for _, period := range periods {
|
|
|
dateStr := period.Start.Format(time.DateOnly)
|
|
|
- // 捞取EMS日志
|
|
|
for _, logType := range payload.Options.EmsLogs {
|
|
|
- downloadList = append(downloadList, domain.BatchDownloadFileTaskInfo{
|
|
|
- DevType: -1,
|
|
|
- Sn: sn,
|
|
|
- Date: dateStr,
|
|
|
- FileType: jobs.FileTypeEmsLog,
|
|
|
- FileSupType: logType,
|
|
|
- Result: 0,
|
|
|
+ tasks = append(tasks, callFilePayload{
|
|
|
+ MainTaskId: mainTaskId,
|
|
|
+ TaskInfo: domain.BatchDownloadFileTaskInfo{
|
|
|
+ DevType: -1,
|
|
|
+ Sn: sn,
|
|
|
+ Date: dateStr,
|
|
|
+ FileType: jobs.FileTypeEmsLog,
|
|
|
+ FileSupType: logType,
|
|
|
+ },
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- for _, sn := range payload.Sn {
|
|
|
- // 捞取故障录波数据
|
|
|
+ // FaultRecord 任务
|
|
|
if payload.Options.FaultRecord {
|
|
|
- // 召唤aGate故障录波
|
|
|
- err := requestCallFaultRecord(&downloadList, 1, sn, startTime, endTime)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
+ frTasks := buildFaultRecordTasks(mainTaskId, sn, startTime, endTime)
|
|
|
+ tasks = append(tasks, frTasks...)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 提取设备的子设备SN - 暂时不支持MPPT和aHub
|
|
|
- siteBaseInfoList, err := repositories.QuerySiteBaseInfoList(dto.SiteBaseInfoPara{
|
|
|
- SiteList: []string{sn},
|
|
|
- PageSize: 10,
|
|
|
- PageNum: 1,
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("查询站点基本信息失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
+ return tasks
|
|
|
+}
|
|
|
|
|
|
- if len(*siteBaseInfoList.Result) > 0 {
|
|
|
- aPowerSnList := strings.Split((*siteBaseInfoList.Result)[0].FhpSn, ",")
|
|
|
- for i := range aPowerSnList {
|
|
|
- aPowerSn := strings.TrimSpace(aPowerSnList[i])
|
|
|
+// buildFaultRecordTasks 为单个 SN 构建故障录波下载任务
|
|
|
+func buildFaultRecordTasks(mainTaskId string, sn string, startTime, endTime time.Time) []callFilePayload {
|
|
|
+ var tasks []callFilePayload
|
|
|
|
|
|
- // 召唤aGate故障录波
|
|
|
- err := requestCallFaultRecord(&downloadList, 0, aPowerSn, startTime, endTime)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- }
|
|
|
+ // 查询 aGate 可召唤列表
|
|
|
+ aGateTasks := buildFaultRecordTasksForDev(mainTaskId, 1, sn, startTime, endTime)
|
|
|
+ tasks = append(tasks, aGateTasks...)
|
|
|
+
|
|
|
+ // 查询 aPower 子设备
|
|
|
+ siteBaseInfoList, err := repositories.QuerySiteBaseInfoList(dto.SiteBaseInfoPara{
|
|
|
+ SiteList: []string{sn},
|
|
|
+ PageSize: 10,
|
|
|
+ PageNum: 1,
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ zap.L().Error("[BatchDownload] 查询站点基本信息失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
+ return tasks
|
|
|
+ }
|
|
|
+
|
|
|
+ if siteBaseInfoList != nil && len(*siteBaseInfoList.Result) > 0 {
|
|
|
+ aPowerSnList := strings.Split((*siteBaseInfoList.Result)[0].FhpSn, ",")
|
|
|
+ for _, aPowerSn := range aPowerSnList {
|
|
|
+ aPowerSn = strings.TrimSpace(aPowerSn)
|
|
|
+ if aPowerSn == "" {
|
|
|
+ continue
|
|
|
}
|
|
|
+ aPowerTasks := buildFaultRecordTasksForDev(mainTaskId, 0, aPowerSn, startTime, endTime)
|
|
|
+ tasks = append(tasks, aPowerTasks...)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 插入文件下载任务
|
|
|
- var isDownloadFile bool = false
|
|
|
- if len(downloadList) > 0 {
|
|
|
- isDownloadFile = true
|
|
|
- err := jobs.CreateCallFwhFileTask(payload.Id, downloadList)
|
|
|
+ return tasks
|
|
|
+}
|
|
|
+
|
|
|
+// buildFaultRecordTasksForDev 为指定设备构建故障录波下载任务
|
|
|
+func buildFaultRecordTasksForDev(mainTaskId string, devType int, sn string, startTime, endTime time.Time) []callFilePayload {
|
|
|
+ callInfoList, err := repositories.QueryFaultRecordCallableList(devType, sn)
|
|
|
+ if err != nil {
|
|
|
+ zap.L().Error("[BatchDownload] 查询故障录波召唤选项失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ if len(callInfoList) == 0 {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // 筛选日期范围内的记录
|
|
|
+ var indexList string
|
|
|
+ for _, info := range callInfoList {
|
|
|
+ failureTime, err := parseFaultRecordTime(info.FailureTime)
|
|
|
if err != nil {
|
|
|
- return nil, err
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ inRange := (failureTime.Equal(startTime) || failureTime.After(startTime)) &&
|
|
|
+ (failureTime.Equal(endTime) || failureTime.Before(endTime))
|
|
|
+ if inRange {
|
|
|
+ if indexList == "" {
|
|
|
+ indexList = strconv.Itoa(info.Idx)
|
|
|
+ } else {
|
|
|
+ indexList = indexList + "," + strconv.Itoa(info.Idx)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 再处理其他数据下载任务
|
|
|
+ // 没有符合日期范围的记录,不创建任务
|
|
|
+ if indexList == "" {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ return []callFilePayload{{
|
|
|
+ MainTaskId: mainTaskId,
|
|
|
+ TaskInfo: domain.BatchDownloadFileTaskInfo{
|
|
|
+ DevType: devType,
|
|
|
+ Sn: sn,
|
|
|
+ Date: startTime.Format(time.DateTime) + "," + endTime.Format(time.DateTime),
|
|
|
+ FileType: jobs.FileTypeFaultRecord,
|
|
|
+ FileSupType: indexList,
|
|
|
+ },
|
|
|
+ }}
|
|
|
+}
|
|
|
+
|
|
|
+// executeSyncTasks 同步执行非文件下载类任务(PowerFlow、MqttLogs、EventAlarm 等)
|
|
|
+func executeSyncTasks(ctx context.Context, payload domain.TaskBatchDownload, periods []timePeriod) error {
|
|
|
for _, sn := range payload.Sn {
|
|
|
- // 生成功率流图文件
|
|
|
+ // PowerFlow
|
|
|
if payload.Options.PowerFlow {
|
|
|
for _, period := range periods {
|
|
|
- // 查询功率流数据
|
|
|
- fmt.Printf("查询功率流数据 - %s\n", period.Start.Format(time.DateOnly))
|
|
|
+ dateStr := period.Start.Format(time.DateOnly)
|
|
|
res, err := repositories.QuerySitePowerFlow(sn, period.Start)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询功率流数据失败", zap.String("sn", sn), zap.String("date", period.Start.Format(time.DateOnly)), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ zap.L().Error("[BatchDownload] 查询功率流数据失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("err", err.Error()))
|
|
|
+ return err
|
|
|
}
|
|
|
- dateStr := period.Start.Format(time.DateOnly)
|
|
|
objName, err := jobs.SaveBatchDownloadPowerFlow(sn, dateStr, *res.Result)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("站点运行时数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
if err := repositories.InsertBatchDownloadPathPowerFlow(payload.Id, sn, dateStr, objName); err != nil {
|
|
|
- zap.L().Error("BatchDownload - PowerFlow文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 生成Mqtt日志数据文件
|
|
|
+ // MqttLogs
|
|
|
for _, logType := range payload.Options.MqttLogs {
|
|
|
- // 查询MQTT日志
|
|
|
- fmt.Printf("查询MQTT日志%s\n", logType)
|
|
|
for _, period := range periods {
|
|
|
logList, err := repositories.QueryMqttLogListOnTimeRange(sn, domain.MqttCmdType(logType), period.Start, period.End)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询MQTT日志失败", zap.String("type", logType), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
-
|
|
|
- // 将结果保存到文件服务器
|
|
|
dateStr := period.Start.Format(time.DateOnly)
|
|
|
objName, err := jobs.SaveBatchDownloadMqttLog(sn, logType, dateStr, logList)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("站点运行时数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
if err := repositories.InsertBatchDownloadPathMqttLogs(payload.Id, sn, logType, dateStr, objName); err != nil {
|
|
|
- zap.L().Error("BatchDownload - MqttLog文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 生成事件&告警日志文件
|
|
|
+ // EventAlarm
|
|
|
if payload.Options.EventAlarm {
|
|
|
- // 查询事件&告警日志
|
|
|
- fmt.Printf("查询事件&告警日志\n")
|
|
|
for _, period := range periods {
|
|
|
eventAlarmList, err := repositories.QueryEventOrAlarmListOnTimeRange(sn, period.Start, period.End, repositories.EventAndAlarm)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询事件&告警日志失败", zap.String("sn", sn), zap.String("startTime", period.Start.Format(time.DateTime)), zap.String("endTime", period.End.Format(time.DateTime)), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
-
|
|
|
- // 将结果保存到文件服务器
|
|
|
dateStr := period.Start.Format(time.DateOnly)
|
|
|
objName, err := jobs.SaveBatchDownloadEventAlarm(sn, dateStr, eventAlarmList)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("站点事件&告警数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
if err := repositories.InsertBatchDownloadPathEventAlarm(payload.Id, sn, dateStr, objName); err != nil {
|
|
|
- zap.L().Error("BatchDownload - EventAlarm文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 生成告警快照文件
|
|
|
+ // AlarmSnapshot
|
|
|
if payload.Options.AlarmSnapshot {
|
|
|
- // 查询告警快照日志
|
|
|
- fmt.Printf("查询告警快照日志\n")
|
|
|
for _, period := range periods {
|
|
|
dateStr := period.Start.Format(time.DateOnly)
|
|
|
alarmSnapshotList, err := jobs.GetAlarmSnapshotData(ctx, sn, dateStr)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询告警快照日志失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
-
|
|
|
- // 将结果保存到文件服务器
|
|
|
objName, err := jobs.SaveBatchDownloadAlarmSnapshot(sn, dateStr, alarmSnapshotList)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("站点告警快照数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
if err := repositories.InsertBatchDownloadPathAlarmSnapshot(payload.Id, sn, dateStr, objName); err != nil {
|
|
|
- zap.L().Error("BatchDownload - AlarmSnapshot文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 生成站点升级日志数据文件
|
|
|
+ // UpdateLog
|
|
|
if payload.Options.UpdateLog {
|
|
|
- fmt.Printf("查询站点升级日志\n")
|
|
|
- updateLogList := []domain.BatchDownloadSystemUpdateLogInfo{}
|
|
|
-
|
|
|
- // 查询系统升级日志
|
|
|
- systemUpdateLogList, err := repositories.QuerySystemUpdateLog(sn)
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("查询站点系统升级日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ if err := executeSyncUpdateLog(sn, payload); err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
|
|
|
- // 查询系统升级日志详细信息
|
|
|
- for _, logList := range systemUpdateLogList {
|
|
|
- var updateLogInfo domain.BatchDownloadSystemUpdateLogInfo
|
|
|
- updateLogInfo.OrderNo = logList.OrderNo
|
|
|
- updateLogInfo.GateSn = sn
|
|
|
- updateLogInfo.FileName = logList.Name
|
|
|
-
|
|
|
- // 解析 UTC 时间
|
|
|
- upgradeTime, err := time.ParseInLocation(time.DateTime, logList.UpgradeTime, time.UTC)
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
-
|
|
|
- // 转换成北京时间
|
|
|
- beijing, _ := time.LoadLocation("Asia/Shanghai")
|
|
|
- bt := upgradeTime.In(beijing)
|
|
|
- updateLogInfo.UpdateTime = bt.Format(time.DateTime)
|
|
|
-
|
|
|
- // 判断升级触发类型
|
|
|
- if strings.HasPrefix(logList.OrderNo, "CH") {
|
|
|
- // 自动升级
|
|
|
- updateLogInfo.TriggerType = "Auto"
|
|
|
- } else if strings.HasPrefix(logList.OrderNo, "DH") {
|
|
|
- // 手动升级
|
|
|
- updateLogInfo.TriggerType = "Manual"
|
|
|
- } else if strings.HasPrefix(logList.OrderNo, "SH") {
|
|
|
- // SPAN自动升级
|
|
|
- updateLogInfo.TriggerType = "Span Auto"
|
|
|
- } else {
|
|
|
- // 其他未知
|
|
|
- updateLogInfo.TriggerType = "unknown"
|
|
|
- }
|
|
|
-
|
|
|
- // 判断升级结果
|
|
|
- switch logList.Result {
|
|
|
- case 1: // 升级中
|
|
|
- updateLogInfo.Result = "Updating"
|
|
|
- case 2: // 成功
|
|
|
- updateLogInfo.Result = "Success"
|
|
|
- case 3: // 失败
|
|
|
- updateLogInfo.Result = "Fault"
|
|
|
- default:
|
|
|
- updateLogInfo.Result = fmt.Sprintf("unknown(%d)", logList.Result)
|
|
|
- }
|
|
|
-
|
|
|
- systemUpdateLogListDetail, err := repositories.QuerySystemUpdateLogDetail(logList.Id)
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("查询站点系统升级详细日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- // 提取对应SN数据,并提取版本数据
|
|
|
- for _, logDetail := range systemUpdateLogListDetail {
|
|
|
- if logDetail.GatewayId == sn {
|
|
|
- // 提取Gate版本数据
|
|
|
- for _, ibgVer := range logDetail.IbgVersionNew {
|
|
|
- if ibgVer.Children != nil {
|
|
|
- for _, childVerInfo := range ibgVer.Children {
|
|
|
- var verInfo domain.BatchDownloadUpdateLogVersionInfo
|
|
|
- verInfo.Name = childVerInfo.Type
|
|
|
- verInfo.OldVer = childVerInfo.OldVersion
|
|
|
- verInfo.NewVer = childVerInfo.Version
|
|
|
- updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, verInfo)
|
|
|
- }
|
|
|
- } else {
|
|
|
- var verInfo domain.BatchDownloadUpdateLogVersionInfo
|
|
|
- verInfo.Name = ibgVer.Type
|
|
|
- verInfo.OldVer = ibgVer.OldVersion
|
|
|
- verInfo.NewVer = ibgVer.Version
|
|
|
- updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, verInfo)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 提取子设备版本数据
|
|
|
- for _, subInfo := range logDetail.SonNewDevices {
|
|
|
- var subDevInfo domain.BatchDownloadUpdateLogSubDevInfo
|
|
|
- subDevInfo.DevSn = subInfo.ApowerSn
|
|
|
- for _, firstItem := range subInfo.FirstList {
|
|
|
- for _, secondItem := range firstItem.Secondlist {
|
|
|
- for _, thirdItem := range secondItem.Thirdlist {
|
|
|
- var verInfo domain.BatchDownloadUpdateLogVersionInfo
|
|
|
- verInfo.Name = thirdItem.SubType
|
|
|
- verInfo.OldVer = thirdItem.OldVersion
|
|
|
- verInfo.NewVer = thirdItem.Version
|
|
|
- subDevInfo.DevVerList = append(subDevInfo.DevVerList, verInfo)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- updateLogInfo.SubDevList = append(updateLogInfo.SubDevList, subDevInfo)
|
|
|
- }
|
|
|
+// waitForCallFileTasks 等待所有子任务完成,收集失败原因
|
|
|
+func waitForCallFileTasks(ctx context.Context, mainTaskId string) ([]string, error) {
|
|
|
+ counterKey := callFileCounterPrefix + mainTaskId
|
|
|
+ failuresKey := callFileFailuresPrefix + mainTaskId
|
|
|
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
+ ticker := time.NewTicker(30 * time.Second)
|
|
|
+ defer ticker.Stop()
|
|
|
|
|
|
- updateLogList = append(updateLogList, updateLogInfo)
|
|
|
- }
|
|
|
+ timeout := time.After(90 * time.Minute) // 90 分钟总超时
|
|
|
|
|
|
- // 查询aHub升级日志
|
|
|
- aHubUpdateLogList, err := repositories.QueryAHubUpdateLog(sn)
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case <-ctx.Done():
|
|
|
+ return nil, ctx.Err()
|
|
|
+ case <-timeout:
|
|
|
+ return nil, fmt.Errorf("等待子任务完成超时(90分钟)")
|
|
|
+ case <-ticker.C:
|
|
|
+ val, err := cache.Get(ctx, counterKey)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询站点aHub升级日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- var aHubUpdateLogData []domain.BatchDownloadAHubUpdateLogInfo
|
|
|
- for _, aHubVerInfo := range aHubUpdateLogList {
|
|
|
- var updateLogInfo domain.BatchDownloadAHubUpdateLogInfo
|
|
|
- updateLogInfo.OrderNo = aHubVerInfo.OrderNo
|
|
|
- updateLogInfo.GateSn = sn
|
|
|
- updateLogInfo.AHubSn = aHubVerInfo.AHubSn
|
|
|
-
|
|
|
- // 判断升级触发类型
|
|
|
- if strings.HasPrefix(aHubVerInfo.OrderNo, "CH") {
|
|
|
- // 自动升级
|
|
|
- updateLogInfo.TriggerType = "Auto"
|
|
|
- } else if strings.HasPrefix(aHubVerInfo.OrderNo, "DH") {
|
|
|
- // 手动升级
|
|
|
- updateLogInfo.TriggerType = "Manual"
|
|
|
- } else if strings.HasPrefix(aHubVerInfo.OrderNo, "SH") {
|
|
|
- // SPAN自动升级
|
|
|
- updateLogInfo.TriggerType = "Span Auto"
|
|
|
+ // key 不存在或读取失败
|
|
|
+ if err.Error() == "redis: nil" {
|
|
|
+ // key 不存在,所有子任务已完成
|
|
|
+ val = "0"
|
|
|
} else {
|
|
|
- // 其他未知
|
|
|
- updateLogInfo.TriggerType = "unknown"
|
|
|
- }
|
|
|
-
|
|
|
- // 判断升级结果
|
|
|
- switch aHubVerInfo.UpgradeResult {
|
|
|
- case 0: // 成功
|
|
|
- updateLogInfo.Result = "Success"
|
|
|
- case -1: // 失败
|
|
|
- updateLogInfo.Result = "Fault"
|
|
|
- default:
|
|
|
- updateLogInfo.Result = fmt.Sprintf("unknown(%d)", aHubVerInfo.UpgradeResult)
|
|
|
+ zap.L().Error("[BatchDownload] 读取计数器失败", zap.String("key", counterKey), zap.String("err", err.Error()))
|
|
|
+ continue
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- for _, detailInfo := range aHubVerInfo.DetailList {
|
|
|
- var aHubDetailInfo domain.BatchDownloadUpdateLogAHubVersionInfo
|
|
|
- aHubDetailInfo.FileName = detailInfo.UpgradeFileName
|
|
|
- aHubDetailInfo.FileOrder = detailInfo.UpgradeFileOrder
|
|
|
- aHubDetailInfo.Result = detailInfo.UpgradeResult
|
|
|
- aHubDetailInfo.ResultDesc = detailInfo.UpgradeResultDesc
|
|
|
- aHubDetailInfo.OldVer = detailInfo.OldVersion
|
|
|
- aHubDetailInfo.NewVer = detailInfo.NewVersion
|
|
|
- updateLogInfo.DetailList = append(updateLogInfo.DetailList, aHubDetailInfo)
|
|
|
+ remaining, _ := strconv.Atoi(val)
|
|
|
+ if remaining <= 0 {
|
|
|
+ // 收集失败原因
|
|
|
+ failures, err := cache.LRange(ctx, failuresKey, 0, -1)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("读取失败原因列表失败: %w", err)
|
|
|
}
|
|
|
|
|
|
- aHubUpdateLogData = append(aHubUpdateLogData, updateLogInfo)
|
|
|
- }
|
|
|
+ // 清理
|
|
|
+ cache.Delete(ctx, counterKey, failuresKey)
|
|
|
|
|
|
- // 将结果保存到文件服务器
|
|
|
- objName, err := jobs.SaveBatchDownloadUpdateLog(sn, updateLogList, aHubUpdateLogData)
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("站点升级记录数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- if err := repositories.InsertBatchDownloadPathUpdateLog(payload.Id, sn, objName); err != nil {
|
|
|
- zap.L().Error("BatchDownload - UpdateLog文件地址写入失败", zap.String("sn", sn), zap.String("objName", objName), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
+ return failures, nil
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
- // TODO 生成站点设置数据文件(仅当前配置,和选择时间范围无关)
|
|
|
- // if payload.Options.Settings {
|
|
|
-
|
|
|
- // }
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if isDownloadFile {
|
|
|
- for {
|
|
|
- // 等待文件下载完成,持续判断文件下载进度
|
|
|
- standbyList, err := repositories.GetBatchDownloadCallFileTaskStandbyList(payload.Id.String())
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("BatchDownload - 读取CallFileTaskStandbyList失败", zap.String("id", payload.Id.String()), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- if len(standbyList) == 0 {
|
|
|
- break
|
|
|
- }
|
|
|
-
|
|
|
- // 等待1分钟后再判断
|
|
|
- time.Sleep(time.Minute)
|
|
|
- }
|
|
|
+// ==================== 辅助函数 ====================
|
|
|
|
|
|
- // 处理失败列表
|
|
|
- failedList, err := repositories.GetBatchDownloadCallFileTaskFailedList(payload.Id.String())
|
|
|
- if err != nil {
|
|
|
- zap.L().Error("BatchDownload - 读取CallFileTaskFailedList失败", zap.String("id", payload.Id.String()), zap.String("err", err.Error()))
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- // 删除task list
|
|
|
- repositories.DeleteBatchDownloadCallFileTaskList(payload.Id.String())
|
|
|
+type timePeriod struct {
|
|
|
+ Start time.Time
|
|
|
+ End time.Time
|
|
|
+}
|
|
|
|
|
|
- var failReasons []string = []string{}
|
|
|
- for _, f := range failedList {
|
|
|
- failReasons = append(failReasons, f.Reason)
|
|
|
+func splitTimePeriods(startTime, endTime time.Time) []timePeriod {
|
|
|
+ var periods []timePeriod
|
|
|
+ curr := startTime
|
|
|
+ for curr.Before(endTime) {
|
|
|
+ dayEnd := time.Date(curr.Year(), curr.Month(), curr.Day(), 23, 59, 59, 0, curr.Location())
|
|
|
+ if dayEnd.After(endTime) {
|
|
|
+ dayEnd = endTime
|
|
|
}
|
|
|
-
|
|
|
- return failReasons, nil
|
|
|
+ periods = append(periods, timePeriod{Start: curr, End: dayEnd})
|
|
|
+ curr = time.Date(curr.Year(), curr.Month(), curr.Day()+1, 0, 0, 0, 0, curr.Location())
|
|
|
}
|
|
|
-
|
|
|
- return nil, nil
|
|
|
+ return periods
|
|
|
}
|
|
|
|
|
|
-// 插入批量数据下载队列
|
|
|
-// payload - 任务参数
|
|
|
-func EnqueueBatchDownloadTask(payload domain.TaskBatchDownload) error {
|
|
|
- p := TaskPayload[domain.TaskBatchDownload]{
|
|
|
- TaskPayloadBase: TaskPayloadBase{
|
|
|
- Type: TaskTypeBatchDownload,
|
|
|
- },
|
|
|
- Payload: payload,
|
|
|
+func parseFaultRecordTime(failureTime string) (time.Time, error) {
|
|
|
+ parts := strings.Split(failureTime, " ")
|
|
|
+ if len(parts) < 2 {
|
|
|
+ return time.Time{}, fmt.Errorf("invalid failureTime format: %s", failureTime)
|
|
|
}
|
|
|
- if err := EnqueueTask[domain.TaskBatchDownload](p); err != nil {
|
|
|
- logger.Std.Printf("EnqueueBatchDownloadTask - %s : %s\n", payload.Id, err.Error())
|
|
|
- return err
|
|
|
+ date := parts[0]
|
|
|
+ timeStr := parts[1]
|
|
|
+
|
|
|
+ d := strings.Split(date, "-")
|
|
|
+ t := strings.Split(timeStr, ":")
|
|
|
+ if len(d) < 3 || len(t) < 3 {
|
|
|
+ return time.Time{}, fmt.Errorf("invalid failureTime format: %s", failureTime)
|
|
|
}
|
|
|
- return nil
|
|
|
+
|
|
|
+ standardTime := fmt.Sprintf("%04s-%02s-%02s %02s:%02s:%02s", d[0], d[1], d[2], t[0], t[1], t[2])
|
|
|
+ return time.Parse(time.DateTime, standardTime)
|
|
|
}
|
|
|
|
|
|
-func requestCallFaultRecord(downloadList *[]domain.BatchDownloadFileTaskInfo, devType int, sn string, startTime time.Time, endTime time.Time) error {
|
|
|
- // 召唤aGate、aPower故障录波
|
|
|
- // 查询要召唤的选项
|
|
|
- callInfoList, err := repositories.QueryFaultRecordCallableList(devType, sn)
|
|
|
+// executeSyncUpdateLog 同步执行升级日志任务(从原代码提取)
|
|
|
+func executeSyncUpdateLog(sn string, payload domain.TaskBatchDownload) error {
|
|
|
+ updateLogList := []domain.BatchDownloadSystemUpdateLogInfo{}
|
|
|
+
|
|
|
+ systemUpdateLogList, err := repositories.QuerySystemUpdateLog(sn)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("查询站点故障录波召唤选项失败", zap.String("sn", sn), zap.String("err", err.Error()))
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- // 未召唤到记录,不添加任务
|
|
|
- if len(callInfoList) == 0 {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- // 提取符合日期范围的选项
|
|
|
- var indexList string = ""
|
|
|
- for _, info := range callInfoList {
|
|
|
- // 转换成标准时间格式
|
|
|
- parts := strings.Split(info.FailureTime, " ")
|
|
|
- date := parts[0]
|
|
|
- timeStr := parts[1]
|
|
|
+ for _, logList := range systemUpdateLogList {
|
|
|
+ var updateLogInfo domain.BatchDownloadSystemUpdateLogInfo
|
|
|
+ updateLogInfo.OrderNo = logList.OrderNo
|
|
|
+ updateLogInfo.GateSn = sn
|
|
|
+ updateLogInfo.FileName = logList.Name
|
|
|
|
|
|
- d := strings.Split(date, "-")
|
|
|
- t2 := strings.Split(timeStr, ":")
|
|
|
+ upgradeTime, err := time.ParseInLocation(time.DateTime, logList.UpgradeTime, time.UTC)
|
|
|
+ if err != nil {
|
|
|
+ zap.L().Warn("[BatchDownload] 升级时间解析失败", zap.String("time", logList.UpgradeTime))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ beijing, _ := time.LoadLocation("Asia/Shanghai")
|
|
|
+ updateLogInfo.UpdateTime = upgradeTime.In(beijing).Format(time.DateTime)
|
|
|
+
|
|
|
+ if strings.HasPrefix(logList.OrderNo, "CH") {
|
|
|
+ updateLogInfo.TriggerType = "Auto"
|
|
|
+ } else if strings.HasPrefix(logList.OrderNo, "DH") {
|
|
|
+ updateLogInfo.TriggerType = "Manual"
|
|
|
+ } else if strings.HasPrefix(logList.OrderNo, "SH") {
|
|
|
+ updateLogInfo.TriggerType = "Span Auto"
|
|
|
+ } else {
|
|
|
+ updateLogInfo.TriggerType = "unknown"
|
|
|
+ }
|
|
|
|
|
|
- failureStandardTime := fmt.Sprintf("%04s-%02s-%02s %02s:%02s:%02s",
|
|
|
- d[0], d[1], d[2], t2[0], t2[1], t2[2])
|
|
|
+ switch logList.Result {
|
|
|
+ case 1:
|
|
|
+ updateLogInfo.Result = "Updating"
|
|
|
+ case 2:
|
|
|
+ updateLogInfo.Result = "Success"
|
|
|
+ case 3:
|
|
|
+ updateLogInfo.Result = "Fault"
|
|
|
+ default:
|
|
|
+ updateLogInfo.Result = fmt.Sprintf("unknown(%d)", logList.Result)
|
|
|
+ }
|
|
|
|
|
|
- failureTime, err := time.Parse(time.DateTime, failureStandardTime)
|
|
|
+ systemUpdateLogListDetail, err := repositories.QuerySystemUpdateLogDetail(logList.Id)
|
|
|
if err != nil {
|
|
|
- zap.L().Error("故障录波召唤选项格式错误", zap.String("sn", sn), zap.String("FailureTime", info.FailureTime), zap.String("err", err.Error()))
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- // 判断是否在范围内(包含边界)
|
|
|
- inRange := (failureTime.Equal(startTime) || failureTime.After(startTime)) &&
|
|
|
- (failureTime.Equal(endTime) || failureTime.Before(endTime))
|
|
|
- if inRange {
|
|
|
- if indexList == "" {
|
|
|
- indexList = indexList + strconv.Itoa(info.Idx)
|
|
|
- } else {
|
|
|
- indexList = indexList + "," + strconv.Itoa(info.Idx)
|
|
|
+ for _, logDetail := range systemUpdateLogListDetail {
|
|
|
+ if logDetail.GatewayId == sn {
|
|
|
+ for _, ibgVer := range logDetail.IbgVersionNew {
|
|
|
+ if ibgVer.Children != nil {
|
|
|
+ for _, childVerInfo := range ibgVer.Children {
|
|
|
+ updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, domain.BatchDownloadUpdateLogVersionInfo{
|
|
|
+ Name: childVerInfo.Type, OldVer: childVerInfo.OldVersion, NewVer: childVerInfo.Version,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, domain.BatchDownloadUpdateLogVersionInfo{
|
|
|
+ Name: ibgVer.Type, OldVer: ibgVer.OldVersion, NewVer: ibgVer.Version,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, subInfo := range logDetail.SonNewDevices {
|
|
|
+ var subDevInfo domain.BatchDownloadUpdateLogSubDevInfo
|
|
|
+ subDevInfo.DevSn = subInfo.ApowerSn
|
|
|
+ for _, firstItem := range subInfo.FirstList {
|
|
|
+ for _, secondItem := range firstItem.Secondlist {
|
|
|
+ for _, thirdItem := range secondItem.Thirdlist {
|
|
|
+ subDevInfo.DevVerList = append(subDevInfo.DevVerList, domain.BatchDownloadUpdateLogVersionInfo{
|
|
|
+ Name: thirdItem.SubType, OldVer: thirdItem.OldVersion, NewVer: thirdItem.Version,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ updateLogInfo.SubDevList = append(updateLogInfo.SubDevList, subDevInfo)
|
|
|
+ }
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
+ updateLogList = append(updateLogList, updateLogInfo)
|
|
|
}
|
|
|
|
|
|
- *downloadList = append(*downloadList, domain.BatchDownloadFileTaskInfo{
|
|
|
- DevType: devType,
|
|
|
- Sn: sn,
|
|
|
- Date: startTime.Format(time.DateTime) + "," + endTime.Format(time.DateTime), // 故障录波的日期是一个范围,用","隔开
|
|
|
- FileType: jobs.FileTypeFaultRecord,
|
|
|
- FileSupType: indexList,
|
|
|
- Result: 0,
|
|
|
- })
|
|
|
+ // aHub 升级日志
|
|
|
+ aHubUpdateLogList, err := repositories.QueryAHubUpdateLog(sn)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- return nil
|
|
|
+ var aHubUpdateLogData []domain.BatchDownloadAHubUpdateLogInfo
|
|
|
+ for _, aHubVerInfo := range aHubUpdateLogList {
|
|
|
+ var info domain.BatchDownloadAHubUpdateLogInfo
|
|
|
+ info.OrderNo = aHubVerInfo.OrderNo
|
|
|
+ info.GateSn = sn
|
|
|
+ info.AHubSn = aHubVerInfo.AHubSn
|
|
|
+
|
|
|
+ if strings.HasPrefix(aHubVerInfo.OrderNo, "CH") {
|
|
|
+ info.TriggerType = "Auto"
|
|
|
+ } else if strings.HasPrefix(aHubVerInfo.OrderNo, "DH") {
|
|
|
+ info.TriggerType = "Manual"
|
|
|
+ } else if strings.HasPrefix(aHubVerInfo.OrderNo, "SH") {
|
|
|
+ info.TriggerType = "Span Auto"
|
|
|
+ } else {
|
|
|
+ info.TriggerType = "unknown"
|
|
|
+ }
|
|
|
+
|
|
|
+ switch aHubVerInfo.UpgradeResult {
|
|
|
+ case 0:
|
|
|
+ info.Result = "Success"
|
|
|
+ case -1:
|
|
|
+ info.Result = "Fault"
|
|
|
+ default:
|
|
|
+ info.Result = fmt.Sprintf("unknown(%d)", aHubVerInfo.UpgradeResult)
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, detailInfo := range aHubVerInfo.DetailList {
|
|
|
+ info.DetailList = append(info.DetailList, domain.BatchDownloadUpdateLogAHubVersionInfo{
|
|
|
+ FileName: detailInfo.UpgradeFileName,
|
|
|
+ FileOrder: detailInfo.UpgradeFileOrder,
|
|
|
+ Result: detailInfo.UpgradeResult,
|
|
|
+ ResultDesc: detailInfo.UpgradeResultDesc,
|
|
|
+ OldVer: detailInfo.OldVersion,
|
|
|
+ NewVer: detailInfo.NewVersion,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ aHubUpdateLogData = append(aHubUpdateLogData, info)
|
|
|
+ }
|
|
|
+
|
|
|
+ objName, err := jobs.SaveBatchDownloadUpdateLog(sn, updateLogList, aHubUpdateLogData)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return repositories.InsertBatchDownloadPathUpdateLog(payload.Id, sn, objName)
|
|
|
}
|