package services import ( "encoding/json" "fmt" "github.com/xuri/excelize/v2" "hongze/mysteel_watch/cache" "hongze/mysteel_watch/global" "hongze/mysteel_watch/models/index" "hongze/mysteel_watch/services/alarm_msg" "hongze/mysteel_watch/utils" "os" "strconv" "strings" "sync" "time" ) const ( FormatTime = "15:04:05" //时间格式 FormatTimeStr = "15:04" //时间格式 ) //var checkLock sync.RWMutex func IndexCreateCheck() (err error) { //checkLock.Lock() //defer func() { // checkLock.Unlock() //}() fmt.Println("IndexCreateCheck") indexObj := new(index.BaseFromMysteelChemicalIndex) list, err := indexObj.GetIndexCreate() if err != nil && err !=utils.ErrNoRow { return } fmt.Println("listLen:", len(list)) if len(list) <= 0 { return nil } var indexCode []string for _, v := range list { indexCode = append(indexCode, v.IndexCode) } indexCodeStr := strings.Join(indexCode, ";") fmt.Println("indexCodeStr:" + indexCodeStr) go alarm_msg.SendAlarmMsg(utils.APPNAME+" 存在指标数据未生成:"+indexCodeStr, 3) for _, v := range list { fmt.Println("IndexCreateCheck start:", v.IndexCode, v.FilePath) if v.FilePath != "" && utils.FileIsExist(v.FilePath) { fmt.Println("Refresh:" + v.IndexCode) err = UpdateComment(v.FilePath) if err != nil { fmt.Println("UpdateComment Err:" + err.Error()) go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3) } time.Sleep(1 * time.Second) MysteelChemicalRefresh(v.FilePath) } else { fmt.Println("IndexCreate:" + v.IndexCode) saveFilePath, err := IndexCreate(v) if err != nil { fmt.Println("IndexCreate Err:" + err.Error()) go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error(), 3) } v.FilePath = saveFilePath fmt.Println("IndexCreate saveFilePath:" + v.FilePath) time.Sleep(1 * time.Second) if utils.FileIsExist(saveFilePath) { MysteelChemicalRefresh(saveFilePath) } fmt.Println("MysteelChemicalRefresh end:" + v.IndexCode) } fmt.Println("IndexCreateCheck end:" + v.IndexCode) } return nil } func IndexCreate(item *index.BaseFromMysteelChemicalIndex) (saveFilePath string, err error) { item.UpdateWeek = utils.GetUpdateWeekEn(item.UpdateWeek) global.LOG.Info("task IndexCreate:" + time.Now().Format(utils.FormatDateTime)) runMode := "release" //fileName := req.IndexName + "_" + req.IndexCode + ".xlsx" var fileName string if item.UpdateWeek != "" { fileName = item.IndexCode + "_" + item.UpdateWeek + "_" + runMode + ".xlsx" //保存的文件名称 } else { fileName = item.IndexCode + "_" + runMode + ".xlsx" //保存的文件名称 } filePath := utils.IndexSaveDir + fileName if utils.FileIsExist(filePath) { os.Remove(filePath) } templatePath := utils.IndexSaveDir + "index_template.xlsx" templateFile, err := excelize.OpenFile(templatePath) if err != nil { fmt.Println("OpenFile template err:" + err.Error()) return } defer func() { templateFile.Close() }() startDate := "1990-01-01" commentStr := `"BlankValue":"0","CanMark":true,"ChartLineType":"0","DateBlock":0,"DateBlockCount":1,"DateFormat":0,"DateTimeTag":"","EndDate":"","ExportType":0,"HasDescription":true,"HasEmptyRows":false,"HasFrequency":true,"HasIndexID":true,"HasLastDate":true,"HasSourceName":true,"HasTimeInterval":true,"HasUnit":true,"HasUpdateDate":true,"IsCreateChart":false,"IsDataSort":true,"IsNewSheet":false,"IsNewWorkbook":false,"Models":[{"DataFormat":0,"DataStartDate":"` + startDate + `","DefineName":"","DefineUnit":"","DisplayIndexCode":"` + item.IndexCode + `","IndexCode":"` + item.IndexCode + `","IndexFormula":"` + item.IndexCode + `","PointValue":0,"UnionStart":""}],"Position":"A1","RangeData":"A2:B280","ShowBlankLines":false,"StartDate":"","Transpose":false,"UpdateMode":1,"lookModel":{"IsLast":false,"LookValue":0,"lookType":0},"ver":3} ` commentMap := make(map[string]interface{}) commentMap["author"] = "{" commentMap["text"] = commentStr commentJson, err := json.Marshal(commentMap) if err != nil { fmt.Println("json.Marshal err:" + err.Error()) } fmt.Println("commentJson") fmt.Println(string(commentJson)) templateFile.DeleteComment("Sheet1", "A1") templateFile.AddComment("Sheet1", "A1", string(commentJson)) if err := templateFile.SaveAs(filePath); err != nil { fmt.Println(err) return "", err } saveFilePath = filePath return } func IndexRefreshAll() { fmt.Println("IndexCreateCheck") indexObj := new(index.BaseFromMysteelChemicalIndex) list, err := indexObj.GetIndexRefreshAll() if err != nil { fmt.Println("GetIndexRefreshAll Err:" + err.Error()) return } fmt.Println("listLen:", len(list)) if len(list) <= 0 { return } nowDate := time.Now().Format(utils.FormatDate) monthLastDay := utils.GetNowMonthLastDay() monthLastDayStr := monthLastDay.Format(utils.FormatDate) yearLast := strconv.Itoa(time.Now().Year()) + "12-31" for _, v := range list { err = UpdateComment(v.FilePath) if err != nil { go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3) } time.Sleep(1 * time.Second) if v.Frequency == "周度" { if v.UpdateWeek == "" && v.UpdateTime == "" && v.UpdateTime2 == "" { //判断本周的数据是否已经存在 MysteelChemicalRefresh(v.FilePath) } } else if v.Frequency == "月度" || v.Frequency == "旬度" { if nowDate == monthLastDayStr { MysteelChemicalRefresh(v.FilePath) } } else if v.Frequency == "年度" && nowDate == yearLast { if nowDate == yearLast { MysteelChemicalRefresh(v.FilePath) } } else if v.Frequency == "日度" { if v.EndDate != nowDate { MysteelChemicalRefresh(v.FilePath) } } else { global.LOG.Info("无效频度:" + v.IndexCode + ";" + v.Frequency) } } return } var lock sync.RWMutex //刷新周度指标数据 func IndexRefreshWeek() { lock.Lock() nowWeek := time.Now().Weekday().String() nowWeekZn := utils.GetWeekZn(nowWeek) fmt.Println("nowWeekZn:" + nowWeekZn) indexObj := new(index.BaseFromMysteelChemicalIndex) startTime := time.Now().Add(-1 * time.Minute).Format(FormatTimeStr) endTime := time.Now().Add(1 * time.Minute).Format(FormatTimeStr) list, err := indexObj.GetIndexRefreshWeek(nowWeekZn, startTime, endTime) if err != nil { fmt.Println("GetIndexRefreshWeek Err:" + err.Error()) return } fmt.Println("listLen:", len(list)) if len(list) <= 0 { return } for _, v := range list { if global.Re == nil && global.Rc != nil { key := utils.REFRESH_INDEX_CODE + v.IndexCode if global.Rc.SetNX(key, v.FilePath, 5*time.Hour) { cache.IndexAutoRefresh(v.FilePath) } } } lock.Unlock() return } // Add 生成指标 func UpdateComment(filePath string) (err error) { templateFile, err := excelize.OpenFile(filePath) if err != nil { fmt.Println("OpenFile Err:" + err.Error()) return } defer func() { templateFile.Close() }() commentArr := templateFile.GetComments() for k, v := range commentArr { fmt.Println(k, v) for _, sv := range v { fmt.Println("text:", sv.Text) if strings.Contains(sv.Text, `"UpdateMode":0`) { newText := strings.Replace(sv.Text, `"UpdateMode":0`, `"UpdateMode":1`, -1) newText = strings.Trim(newText, "{") commentMap := make(map[string]interface{}) commentMap["author"] = "{" commentMap["text"] = newText commentJson, err := json.Marshal(commentMap) if err != nil { fmt.Println("json.Marshal err:" + err.Error()) } fmt.Println("add text:" + string(commentJson)) templateFile.DeleteComment("Sheet1", "A1") err = templateFile.AddComment("Sheet1", "A1", string(commentJson)) if err != nil { fmt.Println("AddComment Err:" + err.Error()) return err } } } } if err := templateFile.SaveAs(filePath); err != nil { fmt.Println("templateFile.SaveAs Err:", err) return err } return }