chart_info.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. package correlation
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/shopspring/decimal"
  7. "hongze/hongze_yb/models/response/chart_info"
  8. "hongze/hongze_yb/models/tables/chart_edb_mapping"
  9. "hongze/hongze_yb/models/tables/chart_info_correlation"
  10. "hongze/hongze_yb/models/tables/edb_data"
  11. "hongze/hongze_yb/services/alarm_msg"
  12. "hongze/hongze_yb/services/chart"
  13. "hongze/hongze_yb/utils"
  14. "math"
  15. "time"
  16. )
  17. // HandleDataByLinearRegression 线性方程插值法补全数据
  18. func HandleDataByLinearRegression(originList []*edb_data.EdbDataList, handleDataMap map[string]float64) (newList []*edb_data.EdbDataList, err error) {
  19. if len(originList) < 2 {
  20. return
  21. }
  22. var startEdbInfoData *edb_data.EdbDataList
  23. for _, v := range originList {
  24. handleDataMap[v.DataTime] = v.Value
  25. // 第一个数据就给过滤了,给后面的试用
  26. if startEdbInfoData == nil {
  27. startEdbInfoData = v
  28. newList = append(newList, &edb_data.EdbDataList{
  29. DataTime: v.DataTime,
  30. Value: v.Value,
  31. })
  32. continue
  33. }
  34. // 获取两条数据之间相差的天数
  35. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  36. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  37. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  38. betweenDay := betweenHour / 24
  39. // 如果相差一天,那么过滤
  40. if betweenDay <= 1 {
  41. startEdbInfoData = v
  42. newList = append(newList, &edb_data.EdbDataList{
  43. DataTime: v.DataTime,
  44. Value: v.Value,
  45. })
  46. continue
  47. }
  48. // 生成线性方程式
  49. var a, b float64
  50. {
  51. coordinateData := make([]utils.Coordinate, 0)
  52. tmpCoordinate1 := utils.Coordinate{
  53. X: 1,
  54. Y: startEdbInfoData.Value,
  55. }
  56. coordinateData = append(coordinateData, tmpCoordinate1)
  57. tmpCoordinate2 := utils.Coordinate{
  58. X: float64(betweenDay) + 1,
  59. Y: v.Value,
  60. }
  61. coordinateData = append(coordinateData, tmpCoordinate2)
  62. a, b = utils.GetLinearResult(coordinateData)
  63. if math.IsNaN(a) || math.IsNaN(b) {
  64. err = fmt.Errorf("线性方程公式生成失败")
  65. return
  66. }
  67. }
  68. // 生成对应的值
  69. {
  70. for i := 1; i < betweenDay; i++ {
  71. tmpDataTime := startDataTime.AddDate(0, 0, i)
  72. aDecimal := decimal.NewFromFloat(a)
  73. xDecimal := decimal.NewFromInt(int64(i) + 1)
  74. bDecimal := decimal.NewFromFloat(b)
  75. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  76. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  77. newList = append(newList, &edb_data.EdbDataList{
  78. DataTime: tmpDataTime.Format(utils.FormatDate),
  79. Value: val,
  80. })
  81. }
  82. }
  83. startEdbInfoData = v
  84. }
  85. return
  86. }
  87. // MoveDataDaysToNewDataList 平移指标数据生成新的数据序列
  88. func MoveDataDaysToNewDataList(dataList []*edb_data.EdbDataList, moveDay int) (newDataList []edb_data.EdbDataList, dateDataMap map[string]float64) {
  89. dateMap := make(map[time.Time]float64)
  90. var minDate, maxDate time.Time
  91. dateDataMap = make(map[string]float64)
  92. for _, v := range dataList {
  93. currDate, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  94. if minDate.IsZero() || currDate.Before(minDate) {
  95. minDate = currDate
  96. }
  97. if maxDate.IsZero() || currDate.After(maxDate) {
  98. maxDate = currDate
  99. }
  100. dateMap[currDate] = v.Value
  101. }
  102. // 处理领先、滞后数据
  103. newDateMap := make(map[time.Time]float64)
  104. for currDate, value := range dateMap {
  105. newDate := currDate.AddDate(0, 0, moveDay)
  106. newDateMap[newDate] = value
  107. }
  108. minDate = minDate.AddDate(0, 0, moveDay)
  109. maxDate = maxDate.AddDate(0, 0, moveDay)
  110. // 获取日期相差日
  111. dayNum := utils.GetTimeSubDay(minDate, maxDate)
  112. for i := 0; i <= dayNum; i++ {
  113. currDate := minDate.AddDate(0, 0, i)
  114. tmpValue, ok := newDateMap[currDate]
  115. if !ok {
  116. //找不到数据,那么就用前面的数据吧
  117. if len(newDataList)-1 < 0 {
  118. tmpValue = 0
  119. } else {
  120. tmpValue = newDataList[len(newDataList)-1].Value
  121. }
  122. }
  123. tmpData := edb_data.EdbDataList{
  124. DataTime: currDate.Format(utils.FormatDate),
  125. Value: tmpValue,
  126. }
  127. dateDataMap[tmpData.DataTime] = tmpData.Value
  128. newDataList = append(newDataList, tmpData)
  129. }
  130. return
  131. }
  132. // GetChartEdbInfoFormat 相关性图表-获取指标信息
  133. func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.ChartEdbInfoMapping) (edbList []*chart_edb_mapping.ChartEdbInfoMappingList, err error) {
  134. edbList = make([]*chart_edb_mapping.ChartEdbInfoMappingList, 0)
  135. if edbInfoMappingA == nil || edbInfoMappingB == nil {
  136. err = fmt.Errorf("指标信息有误")
  137. return
  138. }
  139. edbInfoMappingA.FrequencyEn = chart.GetFrequencyEn(edbInfoMappingA.Frequency)
  140. if edbInfoMappingA.Unit == `无` {
  141. edbInfoMappingA.Unit = ``
  142. }
  143. if edbInfoMappingB.Unit == `无` {
  144. edbInfoMappingB.Unit = ``
  145. }
  146. if chartInfoId <= 0 {
  147. edbInfoMappingA.IsAxis = 1
  148. edbInfoMappingA.LeadValue = 0
  149. edbInfoMappingA.LeadUnit = ""
  150. edbInfoMappingA.ChartEdbMappingId = 0
  151. edbInfoMappingA.ChartInfoId = 0
  152. edbInfoMappingA.IsOrder = false
  153. edbInfoMappingA.EdbInfoType = 1
  154. edbInfoMappingA.ChartStyle = ""
  155. edbInfoMappingA.ChartColor = ""
  156. edbInfoMappingA.ChartWidth = 0
  157. edbInfoMappingB.IsAxis = 1
  158. edbInfoMappingB.LeadValue = 0
  159. edbInfoMappingB.LeadUnit = ""
  160. edbInfoMappingB.ChartEdbMappingId = 0
  161. edbInfoMappingB.ChartInfoId = 0
  162. edbInfoMappingB.IsOrder = false
  163. edbInfoMappingB.EdbInfoType = 1
  164. edbInfoMappingB.ChartStyle = ""
  165. edbInfoMappingB.ChartColor = ""
  166. edbInfoMappingB.ChartWidth = 0
  167. } else {
  168. edbInfoMappingA.LeadUnitEn = chart.GetLeadUnitEn(edbInfoMappingA.LeadUnit)
  169. edbInfoMappingB.LeadUnitEn = chart.GetLeadUnitEn(edbInfoMappingB.LeadUnit)
  170. }
  171. aList := new(chart_edb_mapping.ChartEdbInfoMappingList)
  172. aList.ChartEdbInfoMapping = *edbInfoMappingA
  173. bList := new(chart_edb_mapping.ChartEdbInfoMappingList)
  174. bList.ChartEdbInfoMapping = *edbInfoMappingB
  175. edbList = append(edbList, aList, bList)
  176. return
  177. }
  178. // GetChartDataByEdbInfo 相关性图表-根据指标信息获取x轴和y轴
  179. func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.ChartEdbInfoMapping, leadValue int, leadUnit, startDate, endDate string) (xEdbIdValue []int, yDataList []chart_info.YData, err error) {
  180. xData := make([]int, 0)
  181. yData := make([]float64, 0)
  182. if leadValue == 0 {
  183. xData = append(xData, 0)
  184. }
  185. if leadValue > 0 {
  186. leadMin := 0 - leadValue
  187. xLen := 2*leadValue + 1
  188. for i := 0; i < xLen; i++ {
  189. n := leadMin + i
  190. xData = append(xData, n)
  191. }
  192. }
  193. // 计算窗口,不包含第一天
  194. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  195. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  196. //// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
  197. //baseEdbInfo := edbInfoMappingB
  198. //changeEdbInfo := edbInfoMappingA
  199. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  200. baseEdbInfo := edbInfoMappingA
  201. changeEdbInfo := edbInfoMappingB
  202. // 获取时间基准指标在时间区间内的值
  203. aDataList := make([]*edb_data.EdbDataList, 0)
  204. switch baseEdbInfo.EdbInfoCategoryType {
  205. case 0:
  206. aDataList, err = edb_data.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
  207. case 1:
  208. _, aDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
  209. default:
  210. err = errors.New("指标base类型异常")
  211. return
  212. }
  213. // 获取变频指标所有日期的值, 插值法完善数据
  214. bDataList := make([]*edb_data.EdbDataList, 0)
  215. switch changeEdbInfo.EdbInfoCategoryType {
  216. case 0:
  217. bDataList, err = edb_data.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
  218. case 1:
  219. _, bDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  220. default:
  221. err = errors.New("指标change类型异常")
  222. return
  223. }
  224. //changeDataMap := make(map[string]float64)
  225. //newChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  226. //if e != nil {
  227. // err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  228. // return
  229. //}
  230. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  231. baseDataList := make([]*edb_data.EdbDataList, 0)
  232. baseDataMap := make(map[string]float64)
  233. changeDataList := make([]*edb_data.EdbDataList, 0)
  234. changeDataMap := make(map[string]float64)
  235. // 先把低频指标升频为高频
  236. {
  237. frequencyIntMap := map[string]int{
  238. "日度": 1,
  239. "周度": 2,
  240. "旬度": 3,
  241. "月度": 4,
  242. "季度": 5,
  243. "年度": 6,
  244. }
  245. // 如果A指标是高频,那么就需要对B指标进行升频
  246. if frequencyIntMap[edbInfoMappingA.Frequency] < frequencyIntMap[edbInfoMappingB.Frequency] {
  247. tmpNewChangeDataList, e := HandleDataByLinearRegression(aDataList, baseDataMap)
  248. if e != nil {
  249. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  250. return
  251. }
  252. baseDataList = tmpNewChangeDataList
  253. } else {
  254. baseDataList = aDataList
  255. for _, v := range baseDataList {
  256. baseDataMap[v.DataTime] = v.Value
  257. }
  258. }
  259. // 如果B指标是高频,那么就需要对A指标进行升频
  260. if frequencyIntMap[edbInfoMappingA.Frequency] > frequencyIntMap[edbInfoMappingB.Frequency] {
  261. tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  262. if e != nil {
  263. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  264. return
  265. }
  266. changeDataList = tmpNewChangeDataList
  267. } else {
  268. changeDataList = bDataList
  269. for _, v := range changeDataList {
  270. changeDataMap[v.DataTime] = v.Value
  271. }
  272. }
  273. }
  274. // 计算不领先也不滞后时的相关系数
  275. baseCalculateData := make([]float64, 0)
  276. baseDataTimeArr := make([]string, 0)
  277. for i := range baseDataList {
  278. baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
  279. baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
  280. }
  281. zeroBaseData := make([]float64, 0)
  282. zeroCalculateData := make([]float64, 0)
  283. for i := range baseDataTimeArr {
  284. tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
  285. tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
  286. if ok1 && ok2 {
  287. zeroBaseData = append(zeroBaseData, tmpBaseVal)
  288. zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
  289. }
  290. }
  291. if len(zeroBaseData) != len(zeroCalculateData) {
  292. err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
  293. return
  294. }
  295. zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
  296. if leadValue == 0 {
  297. yData = append(yData, zeroRatio)
  298. }
  299. // 计算领先/滞后N期
  300. if leadValue > 0 {
  301. // 平移变频指标领先/滞后的日期(单位天)
  302. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  303. for i := range xData {
  304. if xData[i] == 0 {
  305. yData = append(yData, zeroRatio)
  306. continue
  307. }
  308. xCalculateData := make([]float64, 0)
  309. yCalculateData := make([]float64, 0)
  310. // 平移指定天数
  311. mDays := int(moveUnitDays) * xData[i]
  312. _, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
  313. // 取出对应的基准日期的值
  314. for i2 := range baseDataTimeArr {
  315. if yVal, ok := dMap[baseDataTimeArr[i2]]; ok {
  316. xCalculateData = append(xCalculateData, baseCalculateData[i2])
  317. yCalculateData = append(yCalculateData, yVal)
  318. }
  319. }
  320. if len(yCalculateData) <= 0 {
  321. //err = fmt.Errorf("领先滞后相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(yCalculateData))
  322. //return
  323. // 领先滞后后,没有可以计算的数据了
  324. continue
  325. }
  326. // 公式计算出领先/滞后频度对应点的相关性系数
  327. ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
  328. yData = append(yData, ratio)
  329. }
  330. }
  331. xEdbIdValue = xData
  332. yDataList = make([]chart_info.YData, 0)
  333. yDate := "0000-00-00"
  334. yDataList = append(yDataList, chart_info.YData{
  335. Date: yDate,
  336. Value: yData,
  337. })
  338. return
  339. }
  340. // GetRollingCorrelationChartDataByEdbInfo 滚动相关性计算
  341. func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.ChartEdbInfoMapping, leadValue int, leadUnit string, calculateValue int, calculateUnit string, startDate, endDate string) (xDateTimeValue []string, yDataList []chart_info.YData, err error) {
  342. xDateTimeValue = make([]string, 0)
  343. yData := make([]float64, 0)
  344. // 计算窗口,不包含第一天
  345. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  346. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  347. baseEdbInfo := edbInfoMappingA
  348. changeEdbInfo := edbInfoMappingB
  349. // 获取时间基准指标在时间区间内的值
  350. aDataList := make([]*edb_data.EdbDataList, 0)
  351. switch baseEdbInfo.EdbInfoCategoryType {
  352. case 0:
  353. aDataList, err = edb_data.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
  354. case 1:
  355. _, aDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
  356. default:
  357. err = errors.New("指标base类型异常")
  358. return
  359. }
  360. // 获取变频指标所有日期的值, 插值法完善数据
  361. bDataList := make([]*edb_data.EdbDataList, 0)
  362. switch changeEdbInfo.EdbInfoCategoryType {
  363. case 0:
  364. bDataList, err = edb_data.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
  365. case 1:
  366. _, bDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  367. default:
  368. err = errors.New("指标change类型异常")
  369. return
  370. }
  371. // 数据平移变频指标领先/滞后的日期(单位天)
  372. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  373. //baseDataList := make([]*edb_data.EdbDataList, 0)
  374. baseDataMap := make(map[string]float64)
  375. changeDataList := make([]*edb_data.EdbDataList, 0)
  376. changeDataMap := make(map[string]float64)
  377. // A指标不管三七二十一,先变个频再说
  378. {
  379. _, e := HandleDataByLinearRegression(aDataList, baseDataMap)
  380. if e != nil {
  381. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  382. return
  383. }
  384. //baseDataList = tmpNewChangeDataList
  385. }
  386. // B指标不管三七二十一,先变个频再说
  387. {
  388. tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  389. if e != nil {
  390. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  391. return
  392. }
  393. changeDataList = tmpNewChangeDataList
  394. // 平移下日期
  395. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  396. _, changeDataMap = MoveDataDaysToNewDataList(changeDataList, leadValue*moveUnitDays)
  397. }
  398. // 计算计算时,需要多少个日期内数据
  399. calculateDay := utils.FrequencyDaysMap[calculateUnit] * calculateValue
  400. // 计算 每个日期的相关性值
  401. {
  402. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  403. endDateTime, _ := time.ParseInLocation(utils.FormatDate, baseEdbInfo.EndDate, time.Local)
  404. endDateTime = endDateTime.AddDate(0, 0, -(calculateDay - 1))
  405. for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
  406. yCalculateData := make([]float64, 0)
  407. baseCalculateData := make([]float64, 0)
  408. // 取出对应的基准日期的值
  409. for i := 0; i < calculateDay; i++ {
  410. iDay := currDay.AddDate(0, 0, i).Format(utils.FormatDate)
  411. tmpBaseValue, ok1 := baseDataMap[iDay]
  412. tmpChangeValue, ok2 := changeDataMap[iDay]
  413. if ok1 && ok2 {
  414. baseCalculateData = append(baseCalculateData, tmpBaseValue)
  415. yCalculateData = append(yCalculateData, tmpChangeValue)
  416. } else {
  417. continue
  418. }
  419. }
  420. // 公式计算出领先/滞后频度对应点的相关性系数
  421. var ratio float64
  422. if len(baseCalculateData) > 0 {
  423. ratio = utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
  424. }
  425. yData = append(yData, ratio)
  426. xDateTimeValue = append(xDateTimeValue, currDay.AddDate(0, 0, calculateDay-1).Format(utils.FormatDate))
  427. }
  428. }
  429. yDataList = make([]chart_info.YData, 0)
  430. yDate := "0000-00-00"
  431. yDataList = append(yDataList, chart_info.YData{
  432. Date: yDate,
  433. Value: yData,
  434. })
  435. return
  436. }
  437. // ChartInfoRefresh 图表刷新
  438. func ChartInfoRefresh(chartInfoId int) (err error) {
  439. var errMsg string
  440. defer func() {
  441. if err != nil {
  442. //fmt.Println(err.Error())
  443. go alarm_msg.SendAlarmMsg("CorrelationChartInfoRefresh: "+errMsg, 3)
  444. }
  445. }()
  446. correlationChart := new(chart_info_correlation.ChartInfoCorrelation)
  447. if err = correlationChart.GetItemById(chartInfoId); err != nil {
  448. errMsg = "获取相关性图表失败, Err: " + err.Error()
  449. return
  450. }
  451. // 批量刷新ETA指标
  452. err, errMsg = chart.EdbInfoRefreshAllFromBase([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false)
  453. if err != nil {
  454. return
  455. }
  456. // 重新生成数据并更新
  457. edbInfoMappingA, err := chart_edb_mapping.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
  458. if err != nil {
  459. errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + err.Error()
  460. return
  461. }
  462. edbInfoMappingB, err := chart_edb_mapping.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
  463. if err != nil {
  464. errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + err.Error()
  465. return
  466. }
  467. periodData, correlationData, err := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
  468. if err != nil {
  469. errMsg = "获取相关性图表, 图表计算值失败, Err:" + err.Error()
  470. return
  471. }
  472. periodDataByte, err := json.Marshal(periodData)
  473. if err != nil {
  474. errMsg = "相关性图表, X轴信息有误, Err:" + err.Error()
  475. return
  476. }
  477. correlationDataByte, err := json.Marshal(correlationData[0].Value)
  478. if err != nil {
  479. errMsg = "相关性图表, Y轴信息有误, Err:" + err.Error()
  480. return
  481. }
  482. correlationChart.PeriodData = string(periodDataByte)
  483. correlationChart.CorrelationData = string(correlationDataByte)
  484. correlationChart.ModifyTime = time.Now().Local()
  485. correlationUpdateCols := []string{"PeriodData", "CorrelationData", "ModifyTime"}
  486. if err = correlationChart.Update(correlationUpdateCols); err != nil {
  487. errMsg = "更新相关性图表失败, Err:" + err.Error()
  488. return
  489. }
  490. return
  491. }