fwhTaskBatchDownload.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package fwhQueueOld
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "fwh-toolbox-server/domain"
  7. "fwh-toolbox-server/dto"
  8. "fwh-toolbox-server/jobs"
  9. "fwh-toolbox-server/logger"
  10. "fwh-toolbox-server/repositories"
  11. "strconv"
  12. "strings"
  13. "time"
  14. "go.uber.org/zap"
  15. )
  16. var (
  17. TaskTypeBatchDownload = "task_BatchDownload"
  18. )
  19. // type TaskBatchDownload = types.TaskBatchDownload
  20. func handleTaskBatchDownload(ctx context.Context, payload domain.TaskBatchDownload) error {
  21. // 更新运行状态
  22. fmt.Println("更新任务运行状态")
  23. if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressRunning, []string{}); repoErr != nil {
  24. zap.L().Error("更新批量数据下载结果状态失败(Running)", zap.String("id", payload.Id.Hex()))
  25. return repoErr
  26. }
  27. fmt.Printf("开始执行任务 %v\n", payload)
  28. reasons, err := executeTaskBatchDownload(ctx, payload)
  29. // 记录任务执行结果
  30. if err != nil {
  31. fmt.Printf("任务执行失败 %s\n", err.Error())
  32. if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressError, []string{err.Error()}); repoErr != nil {
  33. zap.L().Error("更新批量数据下载结果状态失败(Error)", zap.String("id", payload.Id.Hex()))
  34. return repoErr
  35. }
  36. } else {
  37. if len(reasons) == 0 {
  38. fmt.Println("任务执行成功")
  39. if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressComplete, []string{}); repoErr != nil {
  40. zap.L().Error("更新批量数据下载结果状态失败(Complete)", zap.String("id", payload.Id.Hex()), zap.String("err", repoErr.Error()))
  41. return repoErr
  42. }
  43. } else {
  44. fmt.Println("任务执行失败")
  45. if repoErr := repositories.UpdateBatchDownloadResult(payload.Id, domain.ProgressFailed, reasons); repoErr != nil {
  46. zap.L().Error("更新批量数据下载结果状态失败(Complete)", zap.String("id", payload.Id.Hex()), zap.String("err", repoErr.Error()))
  47. return repoErr
  48. }
  49. }
  50. }
  51. return err
  52. }
  53. var executeTaskBatchDownload = func(ctx context.Context, payload domain.TaskBatchDownload) ([]string, error) {
  54. // 转换时间范围,只取用日期部分
  55. startTime, err := time.Parse(time.DateOnly, payload.TimePeriod[0])
  56. if err != nil {
  57. zap.L().Error("StartTime 格式错误", zap.String("time", payload.TimePeriod[0]), zap.String("err", err.Error()))
  58. return nil, err
  59. }
  60. endTime, err := time.Parse(time.DateOnly, payload.TimePeriod[1])
  61. if err != nil {
  62. zap.L().Error("EndTime 格式错误", zap.String("time", payload.TimePeriod[1]), zap.String("err", err.Error()))
  63. return nil, err
  64. }
  65. // 将 endTime 调整到当天的 23:59:59
  66. endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
  67. // 保证 startTime <= endTime
  68. if startTime.After(endTime) {
  69. return nil, errors.New("startTime > endTime")
  70. }
  71. // 按天拆分时间段
  72. var periods []struct{ Start, End time.Time }
  73. currTime := startTime
  74. for currTime.Before(endTime) {
  75. // 当天结束时间
  76. dayEnd := time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 23, 59, 59, 0, currTime.Location())
  77. // 如果当天结束大于 endTime,使用 endTime
  78. if dayEnd.After(endTime) {
  79. dayEnd = endTime
  80. }
  81. periods = append(periods, struct{ Start, End time.Time }{Start: currTime, End: dayEnd})
  82. // 下一天开始
  83. currTime = dayEnd.Add(time.Second).Truncate(24 * time.Hour)
  84. currTime = time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 0, 0, 0, 0, currTime.Location())
  85. }
  86. fmt.Println(payload.Options)
  87. // 优先处理文件下载任务(并行处理缩短时间)
  88. downloadList := []domain.BatchDownloadFileTaskInfo{}
  89. for _, sn := range payload.Sn {
  90. for _, period := range periods {
  91. dateStr := period.Start.Format(time.DateOnly)
  92. // 捞取EMS日志
  93. for _, logType := range payload.Options.EmsLogs {
  94. downloadList = append(downloadList, domain.BatchDownloadFileTaskInfo{
  95. DevType: -1,
  96. Sn: sn,
  97. Date: dateStr,
  98. FileType: jobs.FileTypeEmsLog,
  99. FileSupType: logType,
  100. Result: 0,
  101. })
  102. }
  103. }
  104. }
  105. for _, sn := range payload.Sn {
  106. // 捞取故障录波数据
  107. if payload.Options.FaultRecord {
  108. // 召唤aGate故障录波
  109. err := requestCallFaultRecord(&downloadList, 1, sn, startTime, endTime)
  110. if err != nil {
  111. return nil, err
  112. }
  113. // 提取设备的子设备SN - 暂时不支持MPPT和aHub
  114. siteBaseInfoList, err := repositories.QuerySiteBaseInfoList(dto.SiteBaseInfoPara{
  115. SiteList: []string{sn},
  116. PageSize: 10,
  117. PageNum: 1,
  118. })
  119. if err != nil {
  120. zap.L().Error("查询站点基本信息失败", zap.String("sn", sn), zap.String("err", err.Error()))
  121. return nil, err
  122. }
  123. if len(*siteBaseInfoList.Result) > 0 {
  124. aPowerSnList := strings.Split((*siteBaseInfoList.Result)[0].FhpSn, ",")
  125. for i := range aPowerSnList {
  126. aPowerSn := strings.TrimSpace(aPowerSnList[i])
  127. // 召唤aGate故障录波
  128. err := requestCallFaultRecord(&downloadList, 0, aPowerSn, startTime, endTime)
  129. if err != nil {
  130. return nil, err
  131. }
  132. }
  133. }
  134. }
  135. }
  136. // 插入文件下载任务
  137. var isDownloadFile bool = false
  138. if len(downloadList) > 0 {
  139. isDownloadFile = true
  140. err := jobs.CreateCallFwhFileTask(payload.Id, downloadList)
  141. if err != nil {
  142. return nil, err
  143. }
  144. }
  145. // 再处理其他数据下载任务
  146. for _, sn := range payload.Sn {
  147. // 生成功率流图文件
  148. if payload.Options.PowerFlow {
  149. for _, period := range periods {
  150. // 查询功率流数据
  151. fmt.Printf("查询功率流数据 - %s\n", period.Start.Format(time.DateOnly))
  152. res, err := repositories.QuerySitePowerFlow(sn, period.Start)
  153. if err != nil {
  154. zap.L().Error("查询功率流数据失败", zap.String("sn", sn), zap.String("date", period.Start.Format(time.DateOnly)), zap.String("err", err.Error()))
  155. return nil, err
  156. }
  157. dateStr := period.Start.Format(time.DateOnly)
  158. objName, err := jobs.SaveBatchDownloadPowerFlow(sn, dateStr, *res.Result)
  159. if err != nil {
  160. zap.L().Error("站点运行时数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
  161. return nil, err
  162. }
  163. if err := repositories.InsertBatchDownloadPathPowerFlow(payload.Id, sn, dateStr, objName); err != nil {
  164. zap.L().Error("BatchDownload - PowerFlow文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
  165. return nil, err
  166. }
  167. }
  168. }
  169. // 生成Mqtt日志数据文件
  170. for _, logType := range payload.Options.MqttLogs {
  171. // 查询MQTT日志
  172. fmt.Printf("查询MQTT日志%s\n", logType)
  173. for _, period := range periods {
  174. logList, err := repositories.QueryMqttLogListOnTimeRange(sn, domain.MqttCmdType(logType), period.Start, period.End)
  175. if err != nil {
  176. zap.L().Error("查询MQTT日志失败", zap.String("type", logType), zap.String("err", err.Error()))
  177. return nil, err
  178. }
  179. // 将结果保存到文件服务器
  180. dateStr := period.Start.Format(time.DateOnly)
  181. objName, err := jobs.SaveBatchDownloadMqttLog(sn, logType, dateStr, logList)
  182. if err != nil {
  183. zap.L().Error("站点运行时数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
  184. return nil, err
  185. }
  186. if err := repositories.InsertBatchDownloadPathMqttLogs(payload.Id, sn, logType, dateStr, objName); err != nil {
  187. zap.L().Error("BatchDownload - MqttLog文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
  188. return nil, err
  189. }
  190. }
  191. }
  192. // 生成事件&告警日志文件
  193. if payload.Options.EventAlarm {
  194. // 查询事件&告警日志
  195. fmt.Printf("查询事件&告警日志\n")
  196. for _, period := range periods {
  197. eventAlarmList, err := repositories.QueryEventOrAlarmListOnTimeRange(sn, period.Start, period.End, repositories.EventAndAlarm)
  198. if err != nil {
  199. 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()))
  200. return nil, err
  201. }
  202. // 将结果保存到文件服务器
  203. dateStr := period.Start.Format(time.DateOnly)
  204. objName, err := jobs.SaveBatchDownloadEventAlarm(sn, dateStr, eventAlarmList)
  205. if err != nil {
  206. zap.L().Error("站点事件&告警数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
  207. return nil, err
  208. }
  209. if err := repositories.InsertBatchDownloadPathEventAlarm(payload.Id, sn, dateStr, objName); err != nil {
  210. zap.L().Error("BatchDownload - EventAlarm文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
  211. return nil, err
  212. }
  213. }
  214. }
  215. // 生成告警快照文件
  216. if payload.Options.AlarmSnapshot {
  217. // 查询告警快照日志
  218. fmt.Printf("查询告警快照日志\n")
  219. for _, period := range periods {
  220. dateStr := period.Start.Format(time.DateOnly)
  221. alarmSnapshotList, err := jobs.GetAlarmSnapshotData(ctx, sn, dateStr)
  222. if err != nil {
  223. zap.L().Error("查询告警快照日志失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("err", err.Error()))
  224. return nil, err
  225. }
  226. // 将结果保存到文件服务器
  227. objName, err := jobs.SaveBatchDownloadAlarmSnapshot(sn, dateStr, alarmSnapshotList)
  228. if err != nil {
  229. zap.L().Error("站点告警快照数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
  230. return nil, err
  231. }
  232. if err := repositories.InsertBatchDownloadPathAlarmSnapshot(payload.Id, sn, dateStr, objName); err != nil {
  233. zap.L().Error("BatchDownload - AlarmSnapshot文件地址写入失败", zap.String("sn", sn), zap.String("date", dateStr), zap.String("objName", objName), zap.String("err", err.Error()))
  234. return nil, err
  235. }
  236. }
  237. }
  238. // 生成站点升级日志数据文件
  239. if payload.Options.UpdateLog {
  240. fmt.Printf("查询站点升级日志\n")
  241. updateLogList := []domain.BatchDownloadSystemUpdateLogInfo{}
  242. // 查询系统升级日志
  243. systemUpdateLogList, err := repositories.QuerySystemUpdateLog(sn)
  244. if err != nil {
  245. zap.L().Error("查询站点系统升级日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
  246. return nil, err
  247. }
  248. // 查询系统升级日志详细信息
  249. for _, logList := range systemUpdateLogList {
  250. var updateLogInfo domain.BatchDownloadSystemUpdateLogInfo
  251. updateLogInfo.OrderNo = logList.OrderNo
  252. updateLogInfo.GateSn = sn
  253. updateLogInfo.FileName = logList.Name
  254. // 解析 UTC 时间
  255. upgradeTime, err := time.ParseInLocation(time.DateTime, logList.UpgradeTime, time.UTC)
  256. if err != nil {
  257. panic(err)
  258. }
  259. // 转换成北京时间
  260. beijing, _ := time.LoadLocation("Asia/Shanghai")
  261. bt := upgradeTime.In(beijing)
  262. updateLogInfo.UpdateTime = bt.Format(time.DateTime)
  263. // 判断升级触发类型
  264. if strings.HasPrefix(logList.OrderNo, "CH") {
  265. // 自动升级
  266. updateLogInfo.TriggerType = "Auto"
  267. } else if strings.HasPrefix(logList.OrderNo, "DH") {
  268. // 手动升级
  269. updateLogInfo.TriggerType = "Manual"
  270. } else if strings.HasPrefix(logList.OrderNo, "SH") {
  271. // SPAN自动升级
  272. updateLogInfo.TriggerType = "Span Auto"
  273. } else {
  274. // 其他未知
  275. updateLogInfo.TriggerType = "unknown"
  276. }
  277. // 判断升级结果
  278. switch logList.Result {
  279. case 1: // 升级中
  280. updateLogInfo.Result = "Updating"
  281. case 2: // 成功
  282. updateLogInfo.Result = "Success"
  283. case 3: // 失败
  284. updateLogInfo.Result = "Fault"
  285. default:
  286. updateLogInfo.Result = fmt.Sprintf("unknown(%d)", logList.Result)
  287. }
  288. systemUpdateLogListDetail, err := repositories.QuerySystemUpdateLogDetail(logList.Id, sn)
  289. if err != nil {
  290. zap.L().Error("查询站点系统升级详细日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
  291. return nil, err
  292. }
  293. // 提取对应SN数据,并提取版本数据
  294. for _, logDetail := range systemUpdateLogListDetail {
  295. if logDetail.GatewayId == sn {
  296. // 提取Gate版本数据
  297. for _, ibgVer := range logDetail.IbgVersionNew {
  298. if ibgVer.Children != nil {
  299. for _, childVerInfo := range ibgVer.Children {
  300. var verInfo domain.BatchDownloadUpdateLogVersionInfo
  301. verInfo.Name = childVerInfo.Type
  302. verInfo.OldVer = childVerInfo.OldVersion
  303. verInfo.NewVer = childVerInfo.Version
  304. updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, verInfo)
  305. }
  306. } else {
  307. var verInfo domain.BatchDownloadUpdateLogVersionInfo
  308. verInfo.Name = ibgVer.Type
  309. verInfo.OldVer = ibgVer.OldVersion
  310. verInfo.NewVer = ibgVer.Version
  311. updateLogInfo.GateVerList = append(updateLogInfo.GateVerList, verInfo)
  312. }
  313. }
  314. // 提取子设备版本数据
  315. for _, subInfo := range logDetail.SonNewDevices {
  316. var subDevInfo domain.BatchDownloadUpdateLogSubDevInfo
  317. subDevInfo.DevSn = subInfo.ApowerSn
  318. for _, firstItem := range subInfo.FirstList {
  319. for _, secondItem := range firstItem.Secondlist {
  320. for _, thirdItem := range secondItem.Thirdlist {
  321. var verInfo domain.BatchDownloadUpdateLogVersionInfo
  322. verInfo.Name = thirdItem.SubType
  323. verInfo.OldVer = thirdItem.OldVersion
  324. verInfo.NewVer = thirdItem.Version
  325. subDevInfo.DevVerList = append(subDevInfo.DevVerList, verInfo)
  326. }
  327. }
  328. }
  329. updateLogInfo.SubDevList = append(updateLogInfo.SubDevList, subDevInfo)
  330. }
  331. break
  332. }
  333. }
  334. updateLogList = append(updateLogList, updateLogInfo)
  335. }
  336. // 查询aHub升级日志
  337. aHubUpdateLogList, err := repositories.QueryAHubUpdateLog(sn)
  338. if err != nil {
  339. zap.L().Error("查询站点aHub升级日志失败", zap.String("sn", sn), zap.String("err", err.Error()))
  340. return nil, err
  341. }
  342. var aHubUpdateLogData []domain.BatchDownloadAHubUpdateLogInfo
  343. for _, aHubVerInfo := range aHubUpdateLogList {
  344. var updateLogInfo domain.BatchDownloadAHubUpdateLogInfo
  345. updateLogInfo.OrderNo = aHubVerInfo.OrderNo
  346. updateLogInfo.GateSn = sn
  347. updateLogInfo.AHubSn = aHubVerInfo.AHubSn
  348. // 判断升级触发类型
  349. if strings.HasPrefix(aHubVerInfo.OrderNo, "CH") {
  350. // 自动升级
  351. updateLogInfo.TriggerType = "Auto"
  352. } else if strings.HasPrefix(aHubVerInfo.OrderNo, "DH") {
  353. // 手动升级
  354. updateLogInfo.TriggerType = "Manual"
  355. } else if strings.HasPrefix(aHubVerInfo.OrderNo, "SH") {
  356. // SPAN自动升级
  357. updateLogInfo.TriggerType = "Span Auto"
  358. } else {
  359. // 其他未知
  360. updateLogInfo.TriggerType = "unknown"
  361. }
  362. // 判断升级结果
  363. switch aHubVerInfo.UpgradeResult {
  364. case 0: // 成功
  365. updateLogInfo.Result = "Success"
  366. case -1: // 失败
  367. updateLogInfo.Result = "Fault"
  368. default:
  369. updateLogInfo.Result = fmt.Sprintf("unknown(%d)", aHubVerInfo.UpgradeResult)
  370. }
  371. for _, detailInfo := range aHubVerInfo.DetailList {
  372. var aHubDetailInfo domain.BatchDownloadUpdateLogAHubVersionInfo
  373. aHubDetailInfo.FileName = detailInfo.UpgradeFileName
  374. aHubDetailInfo.FileOrder = detailInfo.UpgradeFileOrder
  375. aHubDetailInfo.Result = detailInfo.UpgradeResult
  376. aHubDetailInfo.ResultDesc = detailInfo.UpgradeResultDesc
  377. aHubDetailInfo.OldVer = detailInfo.OldVersion
  378. aHubDetailInfo.NewVer = detailInfo.NewVersion
  379. updateLogInfo.DetailList = append(updateLogInfo.DetailList, aHubDetailInfo)
  380. }
  381. aHubUpdateLogData = append(aHubUpdateLogData, updateLogInfo)
  382. }
  383. // 将结果保存到文件服务器
  384. objName, err := jobs.SaveBatchDownloadUpdateLog(sn, updateLogList, aHubUpdateLogData)
  385. if err != nil {
  386. zap.L().Error("站点升级记录数据保存失败", zap.String("sn", sn), zap.String("err", err.Error()))
  387. return nil, err
  388. }
  389. if err := repositories.InsertBatchDownloadPathUpdateLog(payload.Id, sn, objName); err != nil {
  390. zap.L().Error("BatchDownload - UpdateLog文件地址写入失败", zap.String("sn", sn), zap.String("objName", objName), zap.String("err", err.Error()))
  391. return nil, err
  392. }
  393. }
  394. // TODO 生成站点设置数据文件(仅当前配置,和选择时间范围无关)
  395. // if payload.Options.Settings {
  396. // }
  397. }
  398. if isDownloadFile {
  399. for {
  400. // 等待文件下载完成,持续判断文件下载进度
  401. standbyList, err := repositories.GetBatchDownloadCallFileTaskStandbyList(payload.Id.Hex())
  402. if err != nil {
  403. zap.L().Error("BatchDownload - 读取CallFileTaskStandbyList失败", zap.String("id", payload.Id.Hex()), zap.String("err", err.Error()))
  404. return nil, err
  405. }
  406. if len(standbyList) == 0 {
  407. break
  408. }
  409. // 等待1分钟后再判断
  410. time.Sleep(time.Minute)
  411. }
  412. // 处理失败列表
  413. failedList, err := repositories.GetBatchDownloadCallFileTaskFailedList(payload.Id.Hex())
  414. if err != nil {
  415. zap.L().Error("BatchDownload - 读取CallFileTaskFailedList失败", zap.String("id", payload.Id.Hex()), zap.String("err", err.Error()))
  416. return nil, err
  417. }
  418. // 删除task list
  419. repositories.DeleteBatchDownloadCallFileTaskList(payload.Id.Hex())
  420. var failReasons []string = []string{}
  421. for _, f := range failedList {
  422. failReasons = append(failReasons, f.Reason)
  423. }
  424. return failReasons, nil
  425. }
  426. return nil, nil
  427. }
  428. // 插入批量数据下载队列
  429. // payload - 任务参数
  430. func EnqueueBatchDownloadTask(payload domain.TaskBatchDownload) error {
  431. p := TaskPayload[domain.TaskBatchDownload]{
  432. TaskPayloadBase: TaskPayloadBase{
  433. Type: TaskTypeBatchDownload,
  434. },
  435. Payload: payload,
  436. }
  437. if err := EnqueueTask[domain.TaskBatchDownload](p); err != nil {
  438. logger.Std.Printf("EnqueueBatchDownloadTask - %s : %s\n", payload.Id, err.Error())
  439. return err
  440. }
  441. return nil
  442. }
  443. func requestCallFaultRecord(downloadList *[]domain.BatchDownloadFileTaskInfo, devType int, sn string, startTime time.Time, endTime time.Time) error {
  444. // 召唤aGate、aPower故障录波
  445. // 查询要召唤的选项
  446. callInfoList, err := repositories.QueryFaultRecordCallableList(devType, sn)
  447. if err != nil {
  448. zap.L().Error("查询站点故障录波召唤选项失败", zap.String("sn", sn), zap.String("err", err.Error()))
  449. return err
  450. }
  451. // 未召唤到记录,不添加任务
  452. if len(callInfoList) == 0 {
  453. return nil
  454. }
  455. // 提取符合日期范围的选项
  456. var indexList string = ""
  457. for _, info := range callInfoList {
  458. // 转换成标准时间格式
  459. parts := strings.Split(info.FailureTime, " ")
  460. date := parts[0]
  461. timeStr := parts[1]
  462. d := strings.Split(date, "-")
  463. t2 := strings.Split(timeStr, ":")
  464. failureStandardTime := fmt.Sprintf("%04s-%02s-%02s %02s:%02s:%02s",
  465. d[0], d[1], d[2], t2[0], t2[1], t2[2])
  466. failureTime, err := time.Parse(time.DateTime, failureStandardTime)
  467. if err != nil {
  468. zap.L().Error("故障录波召唤选项格式错误", zap.String("sn", sn), zap.String("FailureTime", info.FailureTime), zap.String("err", err.Error()))
  469. return err
  470. }
  471. // 判断是否在范围内(包含边界)
  472. inRange := (failureTime.Equal(startTime) || failureTime.After(startTime)) &&
  473. (failureTime.Equal(endTime) || failureTime.Before(endTime))
  474. if inRange {
  475. if indexList == "" {
  476. indexList = indexList + strconv.Itoa(info.Idx)
  477. } else {
  478. indexList = indexList + "," + strconv.Itoa(info.Idx)
  479. }
  480. }
  481. }
  482. *downloadList = append(*downloadList, domain.BatchDownloadFileTaskInfo{
  483. DevType: devType,
  484. Sn: sn,
  485. Date: startTime.Format(time.DateTime) + "," + endTime.Format(time.DateTime), // 故障录波的日期是一个范围,用","隔开
  486. FileType: jobs.FileTypeFaultRecord,
  487. FileSupType: indexList,
  488. Result: 0,
  489. })
  490. return nil
  491. }