getAlarmSnapshot.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package jobs
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "fwh-toolbox-server/ext/api/fwh_pro"
  6. "fwh-toolbox-server/logger"
  7. "fwh-toolbox-server/types"
  8. "fwh-toolbox-server/utils/files"
  9. "io"
  10. "net/http"
  11. "os"
  12. "go.uber.org/zap"
  13. )
  14. type AlarmSnapshotInfo struct {
  15. Id uint64 `json:"id"`
  16. CodeType int `json:"codeType"` // 作用未知
  17. FileName string `json:"fileName"`
  18. FileUrl string `json:"fileUrl"`
  19. LinkId string `json:"linkId"` // site SN
  20. LogTime string `json:"logTime"` // format YYYY-MM-DD
  21. SerialNumber string `json:"serialNumber"`
  22. StartTime string `json:"startTime"` // format YYYY-MM-DD HH:mm:SS
  23. EndTime string `json:"endTime"` // format YYYY-MM-DD HH:mm:SS
  24. Status int `json:"status"` // 1-完成
  25. CompleteTime string `json:"completeTime"` // format YYYY-MM-DD HH:mm:SS
  26. }
  27. type AlarmSnapshotListResponse = types.FwhPageResponse[AlarmSnapshotInfo]
  28. // 解析
  29. func handleAlarmSnapshot(sn string, logTime string, page int) (uint64, []AlarmSnapshotInfo, error) {
  30. // 查询告警快照数据
  31. resByte, err := fwh_pro.QueryAlarmSnapshotInfo(sn, logTime, page)
  32. if err != nil {
  33. return 0, nil, fmt.Errorf("[handleAlarmSnapshot] %s", err.Error())
  34. }
  35. var alarmSnapshotRes AlarmSnapshotListResponse
  36. // 反序列化(unmarshal)
  37. jsonErr := json.Unmarshal(resByte, &alarmSnapshotRes)
  38. if jsonErr != nil {
  39. return 0, nil, fmt.Errorf("[handleAlarmSnapshot] %s", jsonErr)
  40. }
  41. return alarmSnapshotRes.Total, alarmSnapshotRes.Result, nil
  42. }
  43. // 获取告警快照
  44. // 从FHW后端请求快照文件后,处理并放入数据库
  45. // logTime 格式 YYYY-MM-DD
  46. func GetAlarmSnapshot(sn, logTime string) error {
  47. // 请求快照信息列表
  48. var page int = 1
  49. snapshotList := make([]AlarmSnapshotInfo, 0)
  50. total, dataList, err := handleAlarmSnapshot(sn, logTime, page)
  51. if err != nil {
  52. return fmt.Errorf("[GetAlarmSnapshot] %s", err.Error())
  53. }
  54. snapshotList = append(snapshotList, dataList...)
  55. for uint64(len(snapshotList)) < total {
  56. page = page + 1
  57. _, dataList, err = handleAlarmSnapshot(sn, logTime, page)
  58. if err != nil {
  59. return fmt.Errorf("[GetAlarmSnapshot] %s", err.Error())
  60. }
  61. snapshotList = append(snapshotList, dataList...)
  62. }
  63. // 创建临时目录存储下载和解压数据
  64. tempDir, err := os.MkdirTemp("", "fwhtb-alarmSnapshot-*")
  65. if err != nil {
  66. logger.Std.Printf("创建临时目录失败: %v\n", err)
  67. return err
  68. }
  69. defer os.RemoveAll(tempDir) // 程序结束时清理临时目录
  70. for _, info := range snapshotList {
  71. // 下载快照文件
  72. if err = files.DownloadFile(info.FileUrl, tempDir+"/"+info.FileName); err != nil {
  73. return err
  74. }
  75. // 解析文件并写入数据库
  76. }
  77. return nil
  78. }
  79. func downloadAlarmSnapshotFile(url, filepath string) error {
  80. // 发送 HTTP GET 请求
  81. resp, err := http.Get(url)
  82. if err != nil {
  83. return err
  84. }
  85. defer resp.Body.Close()
  86. // 创建本地文件
  87. out, err := os.Create(filepath)
  88. if err != nil {
  89. return err
  90. }
  91. defer out.Close()
  92. // 将响应内容写入文件
  93. _, err = io.Copy(out, resp.Body)
  94. return err
  95. }