index.go 8.7 KB

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