index.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package services
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/xuri/excelize/v2"
  6. "hongze/mysteel_watch/cache"
  7. "hongze/mysteel_watch/global"
  8. "hongze/mysteel_watch/models/index"
  9. "hongze/mysteel_watch/services/alarm_msg"
  10. "hongze/mysteel_watch/utils"
  11. "os"
  12. "strconv"
  13. "strings"
  14. "sync"
  15. "time"
  16. )
  17. const (
  18. FormatTime = "15:04:05" //时间格式
  19. FormatTimeStr = "15:04" //时间格式
  20. )
  21. //var checkLock sync.RWMutex
  22. func IndexCreateCheck() (err error) {
  23. //checkLock.Lock()
  24. //defer func() {
  25. // checkLock.Unlock()
  26. //}()
  27. fmt.Println("IndexCreateCheck")
  28. indexObj := new(index.BaseFromMysteelChemicalIndex)
  29. list, err := indexObj.GetIndexCreate()
  30. if err != nil && err !=utils.ErrNoRow {
  31. return
  32. }
  33. fmt.Println("listLen:", len(list))
  34. if len(list) <= 0 {
  35. return nil
  36. }
  37. var indexCode []string
  38. for _, v := range list {
  39. indexCode = append(indexCode, v.IndexCode)
  40. }
  41. indexCodeStr := strings.Join(indexCode, ";")
  42. fmt.Println("indexCodeStr:" + indexCodeStr)
  43. go alarm_msg.SendAlarmMsg(utils.APPNAME+" 存在指标数据未生成:"+indexCodeStr, 3)
  44. for _, v := range list {
  45. fmt.Println("IndexCreateCheck start:", v.IndexCode, v.FilePath)
  46. if v.FilePath != "" && utils.FileIsExist(v.FilePath) {
  47. fmt.Println("Refresh:" + v.IndexCode)
  48. err = UpdateComment(v.FilePath)
  49. if err != nil {
  50. fmt.Println("UpdateComment Err:" + err.Error())
  51. go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3)
  52. }
  53. time.Sleep(1 * time.Second)
  54. MysteelChemicalRefresh(v.FilePath)
  55. } else {
  56. fmt.Println("IndexCreate:" + v.IndexCode)
  57. saveFilePath, err := IndexCreate(v)
  58. if err != nil {
  59. fmt.Println("IndexCreate Err:" + err.Error())
  60. go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error(), 3)
  61. }
  62. v.FilePath = saveFilePath
  63. fmt.Println("IndexCreate saveFilePath:" + v.FilePath)
  64. time.Sleep(1 * time.Second)
  65. if utils.FileIsExist(saveFilePath) {
  66. MysteelChemicalRefresh(saveFilePath)
  67. }
  68. fmt.Println("MysteelChemicalRefresh end:" + v.IndexCode)
  69. }
  70. fmt.Println("IndexCreateCheck end:" + v.IndexCode)
  71. }
  72. return nil
  73. }
  74. func IndexCreate(item *index.BaseFromMysteelChemicalIndex) (saveFilePath string, err error) {
  75. item.UpdateWeek = utils.GetUpdateWeekEn(item.UpdateWeek)
  76. global.LOG.Info("task IndexCreate:" + time.Now().Format(utils.FormatDateTime))
  77. runMode := "release"
  78. //fileName := req.IndexName + "_" + req.IndexCode + ".xlsx"
  79. var fileName string
  80. if item.UpdateWeek != "" {
  81. fileName = item.IndexCode + "_" + item.UpdateWeek + "_" + runMode + ".xlsx" //保存的文件名称
  82. } else {
  83. fileName = item.IndexCode + "_" + runMode + ".xlsx" //保存的文件名称
  84. }
  85. filePath := utils.IndexSaveDir + fileName
  86. if utils.FileIsExist(filePath) {
  87. os.Remove(filePath)
  88. }
  89. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  90. templateFile, err := excelize.OpenFile(templatePath)
  91. if err != nil {
  92. fmt.Println("OpenFile template err:" + err.Error())
  93. return
  94. }
  95. defer func() {
  96. templateFile.Close()
  97. }()
  98. startDate := "1990-01-01"
  99. 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}
  100. `
  101. commentMap := make(map[string]interface{})
  102. commentMap["author"] = "{"
  103. commentMap["text"] = commentStr
  104. commentJson, err := json.Marshal(commentMap)
  105. if err != nil {
  106. fmt.Println("json.Marshal err:" + err.Error())
  107. }
  108. fmt.Println("commentJson")
  109. fmt.Println(string(commentJson))
  110. templateFile.DeleteComment("Sheet1", "A1")
  111. templateFile.AddComment("Sheet1", "A1", string(commentJson))
  112. if err := templateFile.SaveAs(filePath); err != nil {
  113. fmt.Println(err)
  114. return "", err
  115. }
  116. saveFilePath = filePath
  117. return
  118. }
  119. func IndexRefreshAll() {
  120. fmt.Println("IndexCreateCheck")
  121. indexObj := new(index.BaseFromMysteelChemicalIndex)
  122. list, err := indexObj.GetIndexRefreshAll()
  123. if err != nil {
  124. fmt.Println("GetIndexRefreshAll Err:" + err.Error())
  125. return
  126. }
  127. fmt.Println("listLen:", len(list))
  128. if len(list) <= 0 {
  129. return
  130. }
  131. nowDate := time.Now().Format(utils.FormatDate)
  132. monthLastDay := utils.GetNowMonthLastDay()
  133. monthLastDayStr := monthLastDay.Format(utils.FormatDate)
  134. yearLast := strconv.Itoa(time.Now().Year()) + "12-31"
  135. for _, v := range list {
  136. err = UpdateComment(v.FilePath)
  137. if err != nil {
  138. go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3)
  139. }
  140. time.Sleep(1 * time.Second)
  141. if v.Frequency == "周度" {
  142. if v.UpdateWeek == "" && v.UpdateTime == "" && v.UpdateTime2 == "" {
  143. //判断本周的数据是否已经存在
  144. MysteelChemicalRefresh(v.FilePath)
  145. }
  146. } else if v.Frequency == "月度" || v.Frequency == "旬度" {
  147. if nowDate == monthLastDayStr {
  148. MysteelChemicalRefresh(v.FilePath)
  149. }
  150. } else if v.Frequency == "年度" && nowDate == yearLast {
  151. if nowDate == yearLast {
  152. MysteelChemicalRefresh(v.FilePath)
  153. }
  154. } else if v.Frequency == "日度" {
  155. if v.EndDate != nowDate {
  156. MysteelChemicalRefresh(v.FilePath)
  157. }
  158. } else {
  159. global.LOG.Info("无效频度:" + v.IndexCode + ";" + v.Frequency)
  160. }
  161. }
  162. return
  163. }
  164. var lock sync.RWMutex
  165. //刷新周度指标数据
  166. func IndexRefreshWeek() {
  167. lock.Lock()
  168. nowWeek := time.Now().Weekday().String()
  169. nowWeekZn := utils.GetWeekZn(nowWeek)
  170. fmt.Println("nowWeekZn:" + nowWeekZn)
  171. indexObj := new(index.BaseFromMysteelChemicalIndex)
  172. startTime := time.Now().Add(-1 * time.Minute).Format(FormatTimeStr)
  173. endTime := time.Now().Add(1 * time.Minute).Format(FormatTimeStr)
  174. list, err := indexObj.GetIndexRefreshWeek(nowWeekZn, startTime, endTime)
  175. if err != nil {
  176. fmt.Println("GetIndexRefreshWeek Err:" + err.Error())
  177. return
  178. }
  179. fmt.Println("listLen:", len(list))
  180. if len(list) <= 0 {
  181. return
  182. }
  183. for _, v := range list {
  184. if global.Re == nil && global.Rc != nil {
  185. key := utils.REFRESH_INDEX_CODE + v.IndexCode
  186. if global.Rc.SetNX(key, v.FilePath, 5*time.Hour) {
  187. cache.IndexAutoRefresh(v.FilePath)
  188. }
  189. }
  190. }
  191. lock.Unlock()
  192. return
  193. }
  194. // Add 生成指标
  195. func UpdateComment(filePath string) (err error) {
  196. templateFile, err := excelize.OpenFile(filePath)
  197. if err != nil {
  198. fmt.Println("OpenFile Err:" + err.Error())
  199. return
  200. }
  201. defer func() {
  202. templateFile.Close()
  203. }()
  204. commentArr := templateFile.GetComments()
  205. for k, v := range commentArr {
  206. fmt.Println(k, v)
  207. for _, sv := range v {
  208. fmt.Println("text:", sv.Text)
  209. if strings.Contains(sv.Text, `"UpdateMode":0`) {
  210. newText := strings.Replace(sv.Text, `"UpdateMode":0`, `"UpdateMode":1`, -1)
  211. newText = strings.Trim(newText, "{")
  212. commentMap := make(map[string]interface{})
  213. commentMap["author"] = "{"
  214. commentMap["text"] = newText
  215. commentJson, err := json.Marshal(commentMap)
  216. if err != nil {
  217. fmt.Println("json.Marshal err:" + err.Error())
  218. }
  219. fmt.Println("add text:" + string(commentJson))
  220. templateFile.DeleteComment("Sheet1", "A1")
  221. err = templateFile.AddComment("Sheet1", "A1", string(commentJson))
  222. if err != nil {
  223. fmt.Println("AddComment Err:" + err.Error())
  224. return err
  225. }
  226. }
  227. }
  228. }
  229. if err := templateFile.SaveAs(filePath); err != nil {
  230. fmt.Println("templateFile.SaveAs Err:", err)
  231. return err
  232. }
  233. return
  234. }