chart_info.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  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/services/alarm_msg"
  8. "hongze/hongze_chart_lib/utils"
  9. "sort"
  10. "time"
  11. )
  12. // ChartInfoRefreshV1 图表刷新
  13. func ChartInfoRefreshV1(chartInfoId int) (err error) {
  14. var errmsg string
  15. defer func() {
  16. if err != nil {
  17. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
  18. fmt.Println("ChartInfoRefresh Err:" + errmsg)
  19. }
  20. }()
  21. baseEdbInfoArr, calculateInfoArr, err := data_manage.GetChartInfoRefreshData(chartInfoId)
  22. if err != nil {
  23. errmsg = "获取需要刷新的指标失败:Err:" + err.Error()
  24. return
  25. }
  26. var startDate string
  27. newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0)
  28. baseMap := make(map[int]*data_manage.EdbInfo)
  29. for _, bv := range baseEdbInfoArr {
  30. // 如果不是普通指标,那么过滤
  31. if bv.EdbInfoType != 0 {
  32. continue
  33. }
  34. if _, ok := baseMap[bv.EdbInfoId]; !ok {
  35. newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
  36. }
  37. baseMap[bv.EdbInfoId] = bv
  38. }
  39. fmt.Println("calculateInfoArr:", len(calculateInfoArr))
  40. newCalculateInfoArr := make([]*data_manage.EdbInfo, 0)
  41. calculateMap := make(map[int]*data_manage.EdbInfo)
  42. var calculateArr []int
  43. for _, bv := range calculateInfoArr {
  44. if _, ok := calculateMap[bv.EdbInfoId]; !ok {
  45. newCalculateInfoArr = append(newCalculateInfoArr, bv)
  46. calculateArr = append(calculateArr, bv.EdbInfoId)
  47. }
  48. calculateMap[bv.EdbInfoId] = bv
  49. }
  50. sort.Ints(calculateArr)
  51. for _, bv := range newBaseEdbInfoArr {
  52. source := bv.Source
  53. edbInfoId := bv.EdbInfoId
  54. edbCode := bv.EdbCode
  55. startDate = bv.StartDate
  56. frequency := bv.Frequency
  57. if bv.StartDate == "0000-00-00" {
  58. continue
  59. }
  60. sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
  61. if err != nil {
  62. return err
  63. }
  64. var limitDay int
  65. startDate := ""
  66. switch frequency {
  67. case "日度":
  68. limitDay = utils.DATA_REFRESH
  69. case "周度":
  70. limitDay = utils.DATA_REFRESH * 7
  71. case "月度":
  72. limitDay = utils.DATA_REFRESH * 30
  73. case "季度":
  74. limitDay = utils.DATA_REFRESH * 90
  75. case "年度":
  76. limitDay = utils.DATA_REFRESH * 365
  77. default:
  78. limitDay = utils.DATA_REFRESH
  79. }
  80. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  81. fmt.Println("source:", source)
  82. respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
  83. if err != nil {
  84. errmsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
  85. return err
  86. }
  87. if respItem.Ret != 200 {
  88. errmsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
  89. return err
  90. }
  91. //maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
  92. //if err != nil {
  93. // return err
  94. //}
  95. //if maxAndMinItem != nil {
  96. // err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  97. // if err != nil {
  98. // return err
  99. // }
  100. //}
  101. }
  102. //刷新相关计算指标
  103. for _, v := range calculateArr {
  104. edbInfo := calculateMap[v]
  105. if edbInfo == nil {
  106. return err
  107. }
  108. startDate = edbInfo.StartDate
  109. source := edbInfo.Source
  110. if source == utils.DATA_SOURCE_CALCULATE {
  111. startDate = edbInfo.StartDate
  112. sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
  113. if err != nil {
  114. return err
  115. }
  116. startDate = sTime.Format(utils.FormatDate)
  117. }
  118. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  119. if err != nil {
  120. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  121. errmsg = "RefreshEdbCalculateData Err:" + err.Error()
  122. return err
  123. }
  124. if result.Ret != 200 {
  125. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  126. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  127. return fmt.Errorf("刷新失败" + errmsg)
  128. }
  129. fmt.Println("end calculateArr:", v, time.Now())
  130. }
  131. return err
  132. }
  133. // GetFrequencyEn 获取频度的英文版
  134. func GetFrequencyEn(frequency string) (frequencyEn string) {
  135. switch frequency {
  136. case "日度":
  137. frequencyEn = "day"
  138. return
  139. case "周度":
  140. frequencyEn = "week"
  141. return
  142. case "旬度":
  143. frequencyEn = "ten days"
  144. return
  145. case "月度":
  146. frequencyEn = "month"
  147. return
  148. case "季度":
  149. frequencyEn = "quarter"
  150. return
  151. case "年度":
  152. frequencyEn = "year"
  153. return
  154. }
  155. return
  156. }
  157. func GetLeadUnitEn(unit string) (unitEn string) {
  158. switch unit {
  159. case "天":
  160. unitEn = "day"
  161. return
  162. case "周":
  163. unitEn = "week"
  164. return
  165. case "月":
  166. unitEn = "month"
  167. return
  168. case "季":
  169. unitEn = "quarter"
  170. return
  171. case "年":
  172. unitEn = "year"
  173. return
  174. }
  175. return
  176. }
  177. // GetChartEdbData 获取图表的指标数据
  178. func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []models.YData, err error) {
  179. edbList = make([]*models.ChartEdbInfoMapping, 0)
  180. // 指标对应的所有数据
  181. edbDataListMap := make(map[int][]*models.EdbDataList)
  182. for _, v := range mappingList {
  183. //fmt.Println("v:", v.EdbInfoId)
  184. item := new(models.ChartEdbInfoMapping)
  185. item.EdbInfoId = v.EdbInfoId
  186. item.SourceName = v.SourceName
  187. item.Source = v.Source
  188. item.EdbCode = v.EdbCode
  189. item.EdbName = v.EdbName
  190. item.EdbNameEn = v.EdbNameEn
  191. item.Frequency = v.Frequency
  192. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  193. if v.Unit != `无` {
  194. item.Unit = v.Unit
  195. }
  196. item.UnitEn = v.UnitEn
  197. item.StartDate = v.StartDate
  198. item.EndDate = v.EndDate
  199. item.ModifyTime = v.ModifyTime
  200. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  201. item.PredictChartColor = v.PredictChartColor
  202. if chartInfoId <= 0 {
  203. item.IsAxis = 1
  204. item.LeadValue = 0
  205. item.LeadUnit = ""
  206. //item.ChartEdbMappingId = 0
  207. item.ChartInfoId = 0
  208. item.IsOrder = false
  209. item.EdbInfoType = 1
  210. item.ChartStyle = ""
  211. item.ChartColor = ""
  212. item.ChartWidth = 0
  213. item.MaxData = v.MaxValue
  214. item.MinData = v.MinValue
  215. } else {
  216. item.IsAxis = v.IsAxis
  217. item.EdbInfoType = v.EdbInfoType
  218. item.LeadValue = v.LeadValue
  219. item.LeadUnit = v.LeadUnit
  220. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  221. //item.ChartEdbMappingId = v.ChartEdbMappingId
  222. item.ChartInfoId = v.ChartInfoId
  223. item.ChartStyle = v.ChartStyle
  224. item.ChartColor = v.ChartColor
  225. item.ChartWidth = v.ChartWidth
  226. item.IsOrder = v.IsOrder
  227. item.MaxData = v.MaxData
  228. item.MinData = v.MinData
  229. }
  230. item.LatestValue = v.LatestValue
  231. item.LatestDate = v.LatestDate
  232. item.UniqueCode = v.UniqueCode
  233. var startDateReal string
  234. var diffSeconds int64
  235. if chartType == 2 { //季节性图
  236. startDateReal = startDate
  237. } else {
  238. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  239. var startTimeRealTemp time.Time
  240. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  241. switch v.LeadUnit {
  242. case "天":
  243. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  244. case "月":
  245. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  246. case "季":
  247. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  248. case "周":
  249. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  250. case "年":
  251. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  252. }
  253. if startTimeRealTemp.Before(startDateParse) {
  254. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  255. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  256. } else {
  257. startDateReal = startDate
  258. diffSeconds = 0
  259. }
  260. } else {
  261. startDateReal = startDate
  262. }
  263. }
  264. //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  265. calendarPreYear := 0
  266. if calendar == "农历" {
  267. newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
  268. if err != nil {
  269. fmt.Println("time.Parse:" + err.Error())
  270. }
  271. calendarPreYear = newStartDateReal.Year() - 1
  272. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  273. startDateReal = newStartDateReal.Format(utils.FormatDate)
  274. }
  275. dataList := make([]*models.EdbDataList, 0)
  276. //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  277. switch v.EdbInfoCategoryType {
  278. case 0:
  279. dataList, err = models.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate)
  280. case 1:
  281. _, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, false)
  282. default:
  283. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
  284. }
  285. if err != nil {
  286. return
  287. }
  288. edbDataListMap[v.EdbInfoId] = dataList
  289. if diffSeconds != 0 && v.EdbInfoType == 0 {
  290. dataListLen := len(dataList)
  291. for i := 0; i < dataListLen; i++ {
  292. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  293. }
  294. }
  295. if chartType == 2 {
  296. latestDateStr := v.LatestDate //实际数据的截止日期
  297. latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  298. if tmpErr != nil {
  299. err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
  300. return
  301. }
  302. latestDateYear := latestDate.Year() //实际数据截止年份
  303. if calendar == "农历" {
  304. if len(dataList) <= 0 {
  305. result := new(models.EdbDataResult)
  306. item.DataList = result
  307. } else {
  308. result, tmpErr := models.AddCalculateQuarterV5(dataList)
  309. if tmpErr != nil {
  310. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  311. return
  312. }
  313. // 处理季节图的截止日期
  314. for k, edbDataItems := range result.List {
  315. var cuttingDataTimestamp int64
  316. // 切割的日期时间字符串
  317. cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
  318. //如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
  319. if edbDataItems.Year >= latestDateYear {
  320. for _, tmpData := range edbDataItems.Items {
  321. if tmpData.DataTime == cuttingDataTimeStr {
  322. cuttingDataTimestamp = tmpData.DataTimestamp
  323. break
  324. }
  325. }
  326. }
  327. edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
  328. result.List[k] = edbDataItems
  329. }
  330. if result.List[0].Year != calendarPreYear {
  331. itemList := make([]*models.EdbDataList, 0)
  332. items := new(models.EdbDataItems)
  333. //items.Year = calendarPreYear
  334. items.Items = itemList
  335. newResult := new(models.EdbDataResult)
  336. newResult.List = append(newResult.List, items)
  337. newResult.List = append(newResult.List, result.List...)
  338. item.DataList = newResult
  339. } else {
  340. item.DataList = result
  341. }
  342. }
  343. } else {
  344. currentYear := time.Now().Year()
  345. quarterDataList := make([]*models.QuarterData, 0)
  346. quarterMap := make(map[int][]*models.EdbDataList)
  347. var quarterArr []int
  348. for _, v := range dataList {
  349. itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
  350. if tmpErr != nil {
  351. err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
  352. return
  353. }
  354. year := itemDate.Year()
  355. newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
  356. timestamp := newItemDate.UnixNano() / 1e6
  357. v.DataTimestamp = timestamp
  358. if findVal, ok := quarterMap[year]; !ok {
  359. quarterArr = append(quarterArr, year)
  360. findVal = append(findVal, v)
  361. quarterMap[year] = findVal
  362. } else {
  363. findVal = append(findVal, v)
  364. quarterMap[year] = findVal
  365. }
  366. }
  367. for _, v := range quarterArr {
  368. itemList := quarterMap[v]
  369. quarterItem := new(models.QuarterData)
  370. quarterItem.Year = v
  371. quarterItem.DataList = itemList
  372. //如果等于最后的实际日期,那么将切割时间戳记录
  373. if v == latestDateYear {
  374. var cuttingDataTimestamp int64
  375. for _, tmpData := range itemList {
  376. if tmpData.DataTime == latestDateStr {
  377. cuttingDataTimestamp = tmpData.DataTimestamp
  378. break
  379. }
  380. }
  381. quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
  382. } else if v > latestDateYear {
  383. //如果大于最后的实际日期,那么第一个点就是切割的时间戳
  384. if len(itemList) > 0 {
  385. quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
  386. }
  387. }
  388. quarterDataList = append(quarterDataList, quarterItem)
  389. }
  390. item.DataList = quarterDataList
  391. }
  392. } else if chartType == 7 { //柱方图
  393. //item.DataList = dataList
  394. } else {
  395. item.DataList = dataList
  396. }
  397. edbList = append(edbList, item)
  398. }
  399. // 柱方图
  400. if chartType == 7 {
  401. xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartInfoDateList, barChartInfoSort)
  402. } else {
  403. xEdbIdValue = make([]int, 0)
  404. yDataList = make([]models.YData, 0)
  405. }
  406. return
  407. }
  408. // BarChartData 柱方图的数据处理
  409. func BarChartData(mappingList []*models.ChartEdbInfoMapping, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbIdList []int, yDataList []models.YData, err error) {
  410. // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
  411. edbDataMap := make(map[int]map[string]float64)
  412. for edbInfoId, edbDataList := range edbDataListMap {
  413. edbDateData := make(map[string]float64)
  414. for _, edbData := range edbDataList {
  415. edbDateData[edbData.DataTime] = edbData.Value
  416. }
  417. edbDataMap[edbInfoId] = edbDateData
  418. }
  419. // edbIdList 指标展示顺序;x轴的指标顺序
  420. edbIdList = make([]int, 0)
  421. //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
  422. dateData := make(map[int]float64)
  423. if barChartInfoSort.Sort == 0 {
  424. for _, v := range mappingList {
  425. edbIdList = append(edbIdList, v.EdbInfoId)
  426. }
  427. } else {
  428. lenBarChartInfoDateList := len(barChartInfoDateList)
  429. if barChartInfoSort.DateIndex >= lenBarChartInfoDateList {
  430. err = errors.New("排序日期异常")
  431. return
  432. }
  433. notDataEdbIdList := make([]int, 0) //没有数据的指标id
  434. // 日期配置
  435. barChartInfoDate := barChartInfoDateList[barChartInfoSort.DateIndex]
  436. for edbInfoId, dataList := range edbDataListMap {
  437. if len(dataList) <= 0 {
  438. // 没有数据的指标id
  439. notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
  440. continue
  441. }
  442. findDate := barChartInfoDate.Date
  443. switch barChartInfoDate.Type {
  444. case 1: //最新值
  445. findDate = dataList[len(dataList)-1].DataTime
  446. case 2: //近期几天
  447. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  448. if tmpErr != nil {
  449. err = tmpErr
  450. return
  451. }
  452. findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  453. lenData := len(dataList) - 1
  454. for i := lenData; i >= 0; i-- {
  455. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  456. if tmpErr != nil {
  457. err = tmpErr
  458. return
  459. }
  460. if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
  461. findDate = dataList[i].DataTime
  462. break
  463. }
  464. }
  465. case 3: // 固定日期
  466. //最早的日期
  467. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  468. if tmpErr != nil {
  469. err = tmpErr
  470. return
  471. }
  472. //寻找固定日期的数据
  473. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  474. if tmpErr != nil {
  475. err = tmpErr
  476. return
  477. }
  478. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  479. tmpDate := tmpDateTime.Format(utils.FormatDate)
  480. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  481. findDate = tmpDate
  482. break
  483. }
  484. }
  485. default:
  486. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  487. return
  488. }
  489. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  490. dateData[edbInfoId] = tmpValue
  491. } else {
  492. // 没有数据的指标id
  493. notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
  494. }
  495. }
  496. //Sort int `description:"排序类型,0:默认,1:升序,2:降序"`
  497. // 排序
  498. dateDataSort := utils.NewMapSorter(dateData)
  499. sort.Sort(dateDataSort)
  500. if barChartInfoSort.Sort == 1 {
  501. // 先将没有数据的指标id放在最前面
  502. if len(notDataEdbIdList) > 0 {
  503. edbIdList = append(edbIdList, notDataEdbIdList...)
  504. }
  505. for _, v := range dateDataSort {
  506. edbIdList = append(edbIdList, v.Key)
  507. }
  508. } else {
  509. for i := len(dateDataSort) - 1; i >= 0; i-- {
  510. edbIdList = append(edbIdList, dateDataSort[i].Key)
  511. }
  512. // 再将没有数据的指标id放在最后面
  513. if len(notDataEdbIdList) > 0 {
  514. edbIdList = append(edbIdList, notDataEdbIdList...)
  515. }
  516. }
  517. }
  518. yDataList = make([]models.YData, 0) //y轴的数据列表
  519. for _, barChartInfoDate := range barChartInfoDateList {
  520. var maxDate time.Time
  521. findDataList := make([]float64, 0) // 当前日期的数据值
  522. for _, edbInfoId := range edbIdList {
  523. findDate := barChartInfoDate.Date //需要的日期值
  524. dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  525. if len(dataList) <= 0 {
  526. // 没有数据的指标id
  527. findDataList = append(findDataList, 0)
  528. continue
  529. }
  530. switch barChartInfoDate.Type {
  531. case 1: //最新值
  532. dataList := edbDataListMap[edbInfoId]
  533. findDate = dataList[len(dataList)-1].DataTime
  534. case 2: //近期几天
  535. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  536. if tmpErr != nil {
  537. err = tmpErr
  538. return
  539. }
  540. findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  541. lenData := len(dataList) - 1
  542. for i := lenData; i >= 0; i-- {
  543. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  544. if tmpErr != nil {
  545. err = tmpErr
  546. return
  547. }
  548. if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
  549. findDate = dataList[i].DataTime
  550. break
  551. }
  552. }
  553. case 3: // 固定日期
  554. //最早的日期
  555. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  556. if tmpErr != nil {
  557. err = tmpErr
  558. return
  559. }
  560. //寻找固定日期的数据
  561. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  562. if tmpErr != nil {
  563. err = tmpErr
  564. return
  565. }
  566. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  567. tmpDate := tmpDateTime.Format(utils.FormatDate)
  568. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  569. findDate = tmpDate
  570. break
  571. }
  572. }
  573. default:
  574. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  575. return
  576. }
  577. findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
  578. if maxDate.IsZero() {
  579. maxDate = findDateTime
  580. } else {
  581. if findDateTime.After(maxDate) {
  582. maxDate = findDateTime
  583. }
  584. }
  585. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  586. findDataList = append(findDataList, tmpValue)
  587. } else {
  588. findDataList = append(findDataList, 0)
  589. }
  590. }
  591. yDate := "0000-00-00"
  592. if !maxDate.IsZero() {
  593. yDate = maxDate.Format(utils.FormatDate)
  594. }
  595. yDataList = append(yDataList, models.YData{
  596. Date: yDate,
  597. Value: findDataList,
  598. Color: barChartInfoDate.Color,
  599. Name: barChartInfoDate.Name,
  600. })
  601. }
  602. return
  603. }
  604. // ChartInfoRefreshV2 图表刷新
  605. // @author Roc
  606. // @datetime 2022-09-16 10:15:38
  607. // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成 只获取使用的指标id,然后遍历去调用“指标刷新服务”
  608. func ChartInfoRefreshV2(chartInfoId int) (err error) {
  609. var errmsg string
  610. defer func() {
  611. if err != nil {
  612. go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3)
  613. //go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
  614. fmt.Println("ChartInfoRefresh Err:" + errmsg)
  615. }
  616. }()
  617. edbMappingList, err := data_manage.GetChartEdbMappingList(chartInfoId)
  618. if err != nil {
  619. errmsg = "获取需要刷新的指标失败:Err:" + err.Error()
  620. return
  621. }
  622. edbIdList := make([]int, 0)
  623. for _, v := range edbMappingList {
  624. edbIdList = append(edbIdList, v.EdbInfoId)
  625. }
  626. // 批量刷新
  627. err, errmsg = EdbInfoRefreshAllFromBase(edbIdList, false)
  628. if err != nil {
  629. return
  630. }
  631. return
  632. }