chart_info.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package data
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_chart_lib/models"
  6. "hongze/hongze_chart_lib/models/data_manage"
  7. "hongze/hongze_chart_lib/utils"
  8. "sort"
  9. "time"
  10. )
  11. // ChartInfoRefreshV1 图表刷新
  12. func ChartInfoRefreshV1(chartInfoId int) (err error) {
  13. var errmsg string
  14. defer func() {
  15. if err != nil {
  16. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
  17. fmt.Println("ChartInfoRefresh Err:" + errmsg)
  18. }
  19. }()
  20. baseEdbInfoArr, calculateInfoArr, err := data_manage.GetChartInfoRefreshData(chartInfoId)
  21. if err != nil {
  22. errmsg = "获取需要刷新的指标失败:Err:" + err.Error()
  23. return
  24. }
  25. var startDate string
  26. newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0)
  27. baseMap := make(map[int]*data_manage.EdbInfo)
  28. for _, bv := range baseEdbInfoArr {
  29. // 如果不是普通指标,那么过滤
  30. if bv.EdbInfoType != 0 {
  31. continue
  32. }
  33. if _, ok := baseMap[bv.EdbInfoId]; !ok {
  34. newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
  35. }
  36. baseMap[bv.EdbInfoId] = bv
  37. }
  38. fmt.Println("calculateInfoArr:", len(calculateInfoArr))
  39. newCalculateInfoArr := make([]*data_manage.EdbInfo, 0)
  40. calculateMap := make(map[int]*data_manage.EdbInfo)
  41. var calculateArr []int
  42. for _, bv := range calculateInfoArr {
  43. if _, ok := calculateMap[bv.EdbInfoId]; !ok {
  44. newCalculateInfoArr = append(newCalculateInfoArr, bv)
  45. calculateArr = append(calculateArr, bv.EdbInfoId)
  46. }
  47. calculateMap[bv.EdbInfoId] = bv
  48. }
  49. sort.Ints(calculateArr)
  50. for _, bv := range newBaseEdbInfoArr {
  51. source := bv.Source
  52. edbInfoId := bv.EdbInfoId
  53. edbCode := bv.EdbCode
  54. startDate = bv.StartDate
  55. frequency := bv.Frequency
  56. if bv.StartDate == "0000-00-00" {
  57. continue
  58. }
  59. sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
  60. if err != nil {
  61. return err
  62. }
  63. var limitDay int
  64. startDate := ""
  65. switch frequency {
  66. case "日度":
  67. limitDay = utils.DATA_REFRESH
  68. case "周度":
  69. limitDay = utils.DATA_REFRESH * 7
  70. case "月度":
  71. limitDay = utils.DATA_REFRESH * 30
  72. case "季度":
  73. limitDay = utils.DATA_REFRESH * 90
  74. case "年度":
  75. limitDay = utils.DATA_REFRESH * 365
  76. default:
  77. limitDay = utils.DATA_REFRESH
  78. }
  79. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  80. fmt.Println("source:", source)
  81. respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
  82. if err != nil {
  83. errmsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
  84. return err
  85. }
  86. if respItem.Ret != 200 {
  87. errmsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
  88. return err
  89. }
  90. //maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
  91. //if err != nil {
  92. // return err
  93. //}
  94. //if maxAndMinItem != nil {
  95. // err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  96. // if err != nil {
  97. // return err
  98. // }
  99. //}
  100. }
  101. //刷新相关计算指标
  102. for _, v := range calculateArr {
  103. edbInfo := calculateMap[v]
  104. if edbInfo == nil {
  105. return err
  106. }
  107. startDate = edbInfo.StartDate
  108. source := edbInfo.Source
  109. if source == utils.DATA_SOURCE_CALCULATE {
  110. startDate = edbInfo.StartDate
  111. sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
  112. if err != nil {
  113. return err
  114. }
  115. startDate = sTime.Format(utils.FormatDate)
  116. }
  117. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  118. if err != nil {
  119. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  120. errmsg = "RefreshEdbCalculateData Err:" + err.Error()
  121. return err
  122. }
  123. if result.Ret != 200 {
  124. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  125. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  126. return fmt.Errorf("刷新失败" + errmsg)
  127. }
  128. fmt.Println("end calculateArr:", v, time.Now())
  129. }
  130. return err
  131. }
  132. // GetFrequencyEn 获取频度的英文版
  133. func GetFrequencyEn(frequency string) (frequencyEn string) {
  134. switch frequency {
  135. case "日度":
  136. frequencyEn = "day"
  137. return
  138. case "周度":
  139. frequencyEn = "week"
  140. return
  141. case "旬度":
  142. frequencyEn = "ten days"
  143. return
  144. case "月度":
  145. frequencyEn = "month"
  146. return
  147. case "季度":
  148. frequencyEn = "quarter"
  149. return
  150. case "年度":
  151. frequencyEn = "year"
  152. return
  153. }
  154. return
  155. }
  156. func GetLeadUnitEn(unit string) (unitEn string) {
  157. switch unit {
  158. case "天":
  159. unitEn = "day"
  160. return
  161. case "周":
  162. unitEn = "week"
  163. return
  164. case "月":
  165. unitEn = "month"
  166. return
  167. case "季":
  168. unitEn = "quarter"
  169. return
  170. case "年":
  171. unitEn = "year"
  172. return
  173. }
  174. return
  175. }
  176. // GetChartEdbData 获取图表的指标数据
  177. func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping) (edbList []*models.ChartEdbInfoMapping, err error) {
  178. edbList = make([]*models.ChartEdbInfoMapping, 0)
  179. for _, v := range mappingList {
  180. //fmt.Println("v:", v.EdbInfoId)
  181. item := new(models.ChartEdbInfoMapping)
  182. item.EdbInfoId = v.EdbInfoId
  183. item.SourceName = v.SourceName
  184. item.Source = v.Source
  185. item.EdbCode = v.EdbCode
  186. item.EdbName = v.EdbName
  187. item.EdbNameEn = v.EdbNameEn
  188. item.Frequency = v.Frequency
  189. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  190. if v.Unit != `无` {
  191. item.Unit = v.Unit
  192. }
  193. item.UnitEn = v.UnitEn
  194. item.StartDate = v.StartDate
  195. item.EndDate = v.EndDate
  196. item.ModifyTime = v.ModifyTime
  197. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  198. item.PredictChartColor = v.PredictChartColor
  199. if chartInfoId <= 0 {
  200. item.IsAxis = 1
  201. item.LeadValue = 0
  202. item.LeadUnit = ""
  203. //item.ChartEdbMappingId = 0
  204. item.ChartInfoId = 0
  205. item.IsOrder = false
  206. item.EdbInfoType = 1
  207. item.ChartStyle = ""
  208. item.ChartColor = ""
  209. item.ChartWidth = 0
  210. item.MaxData = v.MaxValue
  211. item.MinData = v.MinValue
  212. } else {
  213. item.IsAxis = v.IsAxis
  214. item.EdbInfoType = v.EdbInfoType
  215. item.LeadValue = v.LeadValue
  216. item.LeadUnit = v.LeadUnit
  217. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  218. //item.ChartEdbMappingId = v.ChartEdbMappingId
  219. item.ChartInfoId = v.ChartInfoId
  220. item.ChartStyle = v.ChartStyle
  221. item.ChartColor = v.ChartColor
  222. item.ChartWidth = v.ChartWidth
  223. item.IsOrder = v.IsOrder
  224. item.MaxData = v.MaxData
  225. item.MinData = v.MinData
  226. }
  227. item.LatestValue = v.LatestValue
  228. item.LatestDate = v.LatestDate
  229. item.UniqueCode = v.UniqueCode
  230. var startDateReal string
  231. var diffSeconds int64
  232. if chartType == 2 { //季节性图
  233. startDateReal = startDate
  234. } else {
  235. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  236. var startTimeRealTemp time.Time
  237. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  238. switch v.LeadUnit {
  239. case "天":
  240. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  241. case "月":
  242. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  243. case "季":
  244. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  245. case "周":
  246. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  247. case "年":
  248. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  249. }
  250. if startTimeRealTemp.Before(startDateParse) {
  251. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  252. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  253. } else {
  254. startDateReal = startDate
  255. diffSeconds = 0
  256. }
  257. } else {
  258. startDateReal = startDate
  259. }
  260. }
  261. //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  262. calendarPreYear := 0
  263. if calendar == "农历" {
  264. newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
  265. if err != nil {
  266. fmt.Println("time.Parse:" + err.Error())
  267. }
  268. calendarPreYear = newStartDateReal.Year() - 1
  269. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  270. startDateReal = newStartDateReal.Format(utils.FormatDate)
  271. }
  272. dataList := make([]*models.EdbDataList, 0)
  273. //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  274. switch v.EdbInfoCategoryType {
  275. case 0:
  276. dataList, err = models.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate)
  277. case 1:
  278. dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, false)
  279. default:
  280. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
  281. }
  282. if err != nil {
  283. return
  284. }
  285. if diffSeconds != 0 && v.EdbInfoType == 0 {
  286. dataListLen := len(dataList)
  287. for i := 0; i < dataListLen; i++ {
  288. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  289. }
  290. }
  291. if chartType == 2 {
  292. latestDateStr := v.LatestDate //实际数据的截止日期
  293. latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  294. if tmpErr != nil {
  295. err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
  296. return
  297. }
  298. latestDateYear := latestDate.Year() //实际数据截止年份
  299. if calendar == "农历" {
  300. if len(dataList) <= 0 {
  301. result := new(models.EdbDataResult)
  302. item.DataList = result
  303. } else {
  304. result, tmpErr := models.AddCalculateQuarterV5(dataList)
  305. if tmpErr != nil {
  306. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  307. return
  308. }
  309. // 处理季节图的截止日期
  310. for k, edbDataItems := range result.List {
  311. var cuttingDataTimestamp int64
  312. // 切割的日期时间字符串
  313. cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
  314. //如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
  315. if edbDataItems.Year >= latestDateYear {
  316. for _, tmpData := range edbDataItems.Items {
  317. if tmpData.DataTime == cuttingDataTimeStr {
  318. cuttingDataTimestamp = tmpData.DataTimestamp
  319. break
  320. }
  321. }
  322. }
  323. edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
  324. result.List[k] = edbDataItems
  325. }
  326. if result.List[0].Year != calendarPreYear {
  327. itemList := make([]*models.EdbDataList, 0)
  328. items := new(models.EdbDataItems)
  329. //items.Year = calendarPreYear
  330. items.Items = itemList
  331. newResult := new(models.EdbDataResult)
  332. newResult.List = append(newResult.List, items)
  333. newResult.List = append(newResult.List, result.List...)
  334. item.DataList = newResult
  335. } else {
  336. item.DataList = result
  337. }
  338. }
  339. } else {
  340. currentYear := time.Now().Year()
  341. quarterDataList := make([]*models.QuarterData, 0)
  342. quarterMap := make(map[int][]*models.EdbDataList)
  343. var quarterArr []int
  344. for _, v := range dataList {
  345. itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
  346. if tmpErr != nil {
  347. err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
  348. return
  349. }
  350. year := itemDate.Year()
  351. newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
  352. timestamp := newItemDate.UnixNano() / 1e6
  353. v.DataTimestamp = timestamp
  354. if findVal, ok := quarterMap[year]; !ok {
  355. quarterArr = append(quarterArr, year)
  356. findVal = append(findVal, v)
  357. quarterMap[year] = findVal
  358. } else {
  359. findVal = append(findVal, v)
  360. quarterMap[year] = findVal
  361. }
  362. }
  363. for _, v := range quarterArr {
  364. itemList := quarterMap[v]
  365. quarterItem := new(models.QuarterData)
  366. quarterItem.Year = v
  367. quarterItem.DataList = itemList
  368. //如果等于最后的实际日期,那么将切割时间戳记录
  369. if v == latestDateYear {
  370. var cuttingDataTimestamp int64
  371. for _, tmpData := range itemList {
  372. if tmpData.DataTime == latestDateStr {
  373. cuttingDataTimestamp = tmpData.DataTimestamp
  374. break
  375. }
  376. }
  377. quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
  378. } else if v > latestDateYear {
  379. //如果大于最后的实际日期,那么第一个点就是切割的时间戳
  380. if len(itemList) > 0 {
  381. quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
  382. }
  383. }
  384. quarterDataList = append(quarterDataList, quarterItem)
  385. }
  386. item.DataList = quarterDataList
  387. }
  388. } else {
  389. item.DataList = dataList
  390. }
  391. edbList = append(edbList, item)
  392. }
  393. return
  394. }