package jobs import ( "encoding/json" "fmt" "fwh-toolbox-server/ext/api/fwh_pro" "fwh-toolbox-server/logger" "fwh-toolbox-server/types" "fwh-toolbox-server/utils/files" "io" "net/http" "os" "go.uber.org/zap" ) type AlarmSnapshotInfo struct { Id uint64 `json:"id"` CodeType int `json:"codeType"` // 作用未知 FileName string `json:"fileName"` FileUrl string `json:"fileUrl"` LinkId string `json:"linkId"` // site SN LogTime string `json:"logTime"` // format YYYY-MM-DD SerialNumber string `json:"serialNumber"` StartTime string `json:"startTime"` // format YYYY-MM-DD HH:mm:SS EndTime string `json:"endTime"` // format YYYY-MM-DD HH:mm:SS Status int `json:"status"` // 1-完成 CompleteTime string `json:"completeTime"` // format YYYY-MM-DD HH:mm:SS } type AlarmSnapshotListResponse = types.FwhPageResponse[AlarmSnapshotInfo] // 解析 func handleAlarmSnapshot(sn string, logTime string, page int) (uint64, []AlarmSnapshotInfo, error) { // 查询告警快照数据 resByte, err := fwh_pro.QueryAlarmSnapshotInfo(sn, logTime, page) if err != nil { return 0, nil, fmt.Errorf("[handleAlarmSnapshot] %s", err.Error()) } var alarmSnapshotRes AlarmSnapshotListResponse // 反序列化(unmarshal) jsonErr := json.Unmarshal(resByte, &alarmSnapshotRes) if jsonErr != nil { return 0, nil, fmt.Errorf("[handleAlarmSnapshot] %s", jsonErr) } return alarmSnapshotRes.Total, alarmSnapshotRes.Result, nil } // 获取告警快照 // 从FHW后端请求快照文件后,处理并放入数据库 // logTime 格式 YYYY-MM-DD func GetAlarmSnapshot(sn, logTime string) error { // 请求快照信息列表 var page int = 1 snapshotList := make([]AlarmSnapshotInfo, 0) total, dataList, err := handleAlarmSnapshot(sn, logTime, page) if err != nil { return fmt.Errorf("[GetAlarmSnapshot] %s", err.Error()) } snapshotList = append(snapshotList, dataList...) for uint64(len(snapshotList)) < total { page = page + 1 _, dataList, err = handleAlarmSnapshot(sn, logTime, page) if err != nil { return fmt.Errorf("[GetAlarmSnapshot] %s", err.Error()) } snapshotList = append(snapshotList, dataList...) } // 创建临时目录存储下载和解压数据 tempDir, err := os.MkdirTemp("", "fwhtb-alarmSnapshot-*") if err != nil { logger.Std.Printf("创建临时目录失败: %v\n", err) return err } defer os.RemoveAll(tempDir) // 程序结束时清理临时目录 for _, info := range snapshotList { // 下载快照文件 if err = files.DownloadFile(info.FileUrl, tempDir+"/"+info.FileName); err != nil { return err } // 解析文件并写入数据库 } return nil } func downloadAlarmSnapshotFile(url, filepath string) error { // 发送 HTTP GET 请求 resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() // 创建本地文件 out, err := os.Create(filepath) if err != nil { return err } defer out.Close() // 将响应内容写入文件 _, err = io.Copy(out, resp.Body) return err }