chart_info.go 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. package correlation
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/system"
  7. "eta/eta_api/services/alarm_msg"
  8. "eta/eta_api/services/data"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "github.com/shopspring/decimal"
  12. "math"
  13. "sort"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // HandleDataByLinearRegression 线性方程插值法补全数据
  19. func HandleDataByLinearRegression(originList []*data_manage.EdbDataList, handleDataMap map[string]float64) (newList []*data_manage.EdbDataList, err error) {
  20. if len(originList) < 2 {
  21. return
  22. }
  23. var startEdbInfoData *data_manage.EdbDataList
  24. for _, v := range originList {
  25. handleDataMap[v.DataTime] = v.Value
  26. // 第一个数据就给过滤了,给后面的试用
  27. if startEdbInfoData == nil {
  28. startEdbInfoData = v
  29. newList = append(newList, &data_manage.EdbDataList{
  30. DataTime: v.DataTime,
  31. Value: v.Value,
  32. })
  33. continue
  34. }
  35. // 获取两条数据之间相差的天数
  36. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  37. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  38. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  39. betweenDay := betweenHour / 24
  40. // 如果相差一天,那么过滤
  41. if betweenDay <= 1 {
  42. startEdbInfoData = v
  43. newList = append(newList, &data_manage.EdbDataList{
  44. DataTime: v.DataTime,
  45. Value: v.Value,
  46. })
  47. continue
  48. }
  49. // 生成线性方程式
  50. var a, b float64
  51. {
  52. coordinateData := make([]utils.Coordinate, 0)
  53. tmpCoordinate1 := utils.Coordinate{
  54. X: 1,
  55. Y: startEdbInfoData.Value,
  56. }
  57. coordinateData = append(coordinateData, tmpCoordinate1)
  58. tmpCoordinate2 := utils.Coordinate{
  59. X: float64(betweenDay) + 1,
  60. Y: v.Value,
  61. }
  62. coordinateData = append(coordinateData, tmpCoordinate2)
  63. a, b = utils.GetLinearResult(coordinateData)
  64. if math.IsNaN(a) || math.IsNaN(b) {
  65. err = fmt.Errorf("线性方程公式生成失败")
  66. return
  67. }
  68. }
  69. // 生成对应的值
  70. {
  71. for i := 1; i < betweenDay; i++ {
  72. tmpDataTime := startDataTime.AddDate(0, 0, i)
  73. aDecimal := decimal.NewFromFloat(a)
  74. xDecimal := decimal.NewFromInt(int64(i) + 1)
  75. bDecimal := decimal.NewFromFloat(b)
  76. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  77. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  78. newList = append(newList, &data_manage.EdbDataList{
  79. DataTime: tmpDataTime.Format(utils.FormatDate),
  80. Value: val,
  81. })
  82. }
  83. }
  84. // 最后将自己赋值
  85. newList = append(newList, &data_manage.EdbDataList{
  86. EdbDataId: v.EdbDataId,
  87. DataTime: v.DataTime,
  88. Value: v.Value,
  89. })
  90. startEdbInfoData = v
  91. }
  92. return
  93. }
  94. // MoveDataDaysToNewDataList 平移指标数据生成新的数据序列
  95. func MoveDataDaysToNewDataList(dataList []*data_manage.EdbDataList, moveDay int) (newDataList []data_manage.EdbDataList, dateDataMap map[string]float64) {
  96. dateMap := make(map[time.Time]float64)
  97. var minDate, maxDate time.Time
  98. dateDataMap = make(map[string]float64)
  99. for _, v := range dataList {
  100. currDate, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  101. if minDate.IsZero() || currDate.Before(minDate) {
  102. minDate = currDate
  103. }
  104. if maxDate.IsZero() || currDate.After(maxDate) {
  105. maxDate = currDate
  106. }
  107. dateMap[currDate] = v.Value
  108. }
  109. // 处理领先、滞后数据
  110. newDateMap := make(map[time.Time]float64)
  111. for currDate, value := range dateMap {
  112. newDate := currDate.AddDate(0, 0, moveDay)
  113. newDateMap[newDate] = value
  114. }
  115. minDate = minDate.AddDate(0, 0, moveDay)
  116. maxDate = maxDate.AddDate(0, 0, moveDay)
  117. // 获取日期相差日
  118. dayNum := utils.GetTimeSubDay(minDate, maxDate)
  119. for i := 0; i <= dayNum; i++ {
  120. currDate := minDate.AddDate(0, 0, i)
  121. tmpValue, ok := newDateMap[currDate]
  122. if !ok {
  123. //找不到数据,那么就用前面的数据吧
  124. if len(newDataList)-1 < 0 {
  125. tmpValue = 0
  126. } else {
  127. tmpValue = newDataList[len(newDataList)-1].Value
  128. }
  129. }
  130. tmpData := data_manage.EdbDataList{
  131. DataTime: currDate.Format(utils.FormatDate),
  132. Value: tmpValue,
  133. }
  134. dateDataMap[tmpData.DataTime] = tmpData.Value
  135. newDataList = append(newDataList, tmpData)
  136. }
  137. return
  138. }
  139. // GetChartEdbInfoFormat 相关性图表-获取指标信息
  140. func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
  141. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  142. if edbInfoMappingA == nil || edbInfoMappingB == nil {
  143. err = fmt.Errorf("指标信息有误")
  144. return
  145. }
  146. edbInfoMappingA.FrequencyEn = data.GetFrequencyEn(edbInfoMappingA.Frequency)
  147. if edbInfoMappingA.Unit == `无` {
  148. edbInfoMappingA.Unit = ``
  149. }
  150. if edbInfoMappingB.Unit == `无` {
  151. edbInfoMappingB.Unit = ``
  152. }
  153. if chartInfoId <= 0 {
  154. edbInfoMappingA.IsAxis = 1
  155. edbInfoMappingA.LeadValue = 0
  156. edbInfoMappingA.LeadUnit = ""
  157. edbInfoMappingA.ChartEdbMappingId = 0
  158. edbInfoMappingA.ChartInfoId = 0
  159. edbInfoMappingA.IsOrder = false
  160. edbInfoMappingA.EdbInfoType = 1
  161. edbInfoMappingA.ChartStyle = ""
  162. edbInfoMappingA.ChartColor = ""
  163. edbInfoMappingA.ChartWidth = 0
  164. edbInfoMappingB.IsAxis = 1
  165. edbInfoMappingB.LeadValue = 0
  166. edbInfoMappingB.LeadUnit = ""
  167. edbInfoMappingB.ChartEdbMappingId = 0
  168. edbInfoMappingB.ChartInfoId = 0
  169. edbInfoMappingB.IsOrder = false
  170. edbInfoMappingB.EdbInfoType = 1
  171. edbInfoMappingB.ChartStyle = ""
  172. edbInfoMappingB.ChartColor = ""
  173. edbInfoMappingB.ChartWidth = 0
  174. } else {
  175. edbInfoMappingA.LeadUnitEn = data.GetLeadUnitEn(edbInfoMappingA.LeadUnit)
  176. edbInfoMappingB.LeadUnitEn = data.GetLeadUnitEn(edbInfoMappingB.LeadUnit)
  177. }
  178. edbList = append(edbList, edbInfoMappingA, edbInfoMappingB)
  179. return
  180. }
  181. // GetChartDataByEdbInfo 相关性图表-根据指标信息获取x轴和y轴
  182. func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping, leadValue int, leadUnit, startDate, endDate string) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
  183. xData := make([]int, 0)
  184. yData := make([]float64, 0)
  185. if leadValue == 0 {
  186. xData = append(xData, 0)
  187. }
  188. if leadValue > 0 {
  189. leadMin := 0 - leadValue
  190. xLen := 2*leadValue + 1
  191. for i := 0; i < xLen; i++ {
  192. n := leadMin + i
  193. xData = append(xData, n)
  194. }
  195. }
  196. // 计算窗口,不包含第一天
  197. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  198. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  199. //// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
  200. //baseEdbInfo := edbInfoMappingB
  201. //changeEdbInfo := edbInfoMappingA
  202. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  203. baseEdbInfo := edbInfoMappingA
  204. changeEdbInfo := edbInfoMappingB
  205. // 获取时间基准指标在时间区间内的值
  206. aDataList := make([]*data_manage.EdbDataList, 0)
  207. switch baseEdbInfo.EdbInfoCategoryType {
  208. case 0:
  209. aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
  210. case 1:
  211. _, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
  212. default:
  213. err = errors.New("指标base类型异常")
  214. return
  215. }
  216. // 获取变频指标所有日期的值, 插值法完善数据
  217. bDataList := make([]*data_manage.EdbDataList, 0)
  218. switch changeEdbInfo.EdbInfoCategoryType {
  219. case 0:
  220. bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
  221. case 1:
  222. _, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  223. default:
  224. err = errors.New("指标change类型异常")
  225. return
  226. }
  227. //changeDataMap := make(map[string]float64)
  228. //newChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  229. //if e != nil {
  230. // err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  231. // return
  232. //}
  233. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  234. baseDataList := make([]*data_manage.EdbDataList, 0)
  235. baseDataMap := make(map[string]float64)
  236. changeDataList := make([]*data_manage.EdbDataList, 0)
  237. changeDataMap := make(map[string]float64)
  238. // 先把低频指标升频为高频
  239. {
  240. frequencyIntMap := map[string]int{
  241. "日度": 1,
  242. "周度": 2,
  243. "旬度": 3,
  244. "月度": 4,
  245. "季度": 5,
  246. "年度": 6,
  247. }
  248. // 如果A指标是高频,那么就需要对B指标进行升频
  249. if frequencyIntMap[edbInfoMappingA.Frequency] < frequencyIntMap[edbInfoMappingB.Frequency] {
  250. tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  251. if e != nil {
  252. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  253. return
  254. }
  255. changeDataList = tmpNewChangeDataList
  256. // 基础指标不用变
  257. baseDataList = aDataList
  258. for _, v := range baseDataList {
  259. baseDataMap[v.DataTime] = v.Value
  260. }
  261. }
  262. // 如果B指标是高频,那么就需要对A指标进行升频
  263. if frequencyIntMap[edbInfoMappingA.Frequency] > frequencyIntMap[edbInfoMappingB.Frequency] {
  264. tmpNewChangeDataList, e := HandleDataByLinearRegression(aDataList, baseDataMap)
  265. if e != nil {
  266. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  267. return
  268. }
  269. baseDataList = tmpNewChangeDataList
  270. // B指标不用变
  271. changeDataList = bDataList
  272. for _, v := range changeDataList {
  273. changeDataMap[v.DataTime] = v.Value
  274. }
  275. }
  276. }
  277. // 计算不领先也不滞后时的相关系数
  278. baseCalculateData := make([]float64, 0)
  279. baseDataTimeArr := make([]string, 0)
  280. for i := range baseDataList {
  281. baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
  282. baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
  283. }
  284. zeroBaseData := make([]float64, 0)
  285. zeroCalculateData := make([]float64, 0)
  286. for i := range baseDataTimeArr {
  287. tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
  288. tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
  289. if ok1 && ok2 {
  290. zeroBaseData = append(zeroBaseData, tmpBaseVal)
  291. zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
  292. }
  293. }
  294. if len(zeroBaseData) != len(zeroCalculateData) {
  295. err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
  296. return
  297. }
  298. zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
  299. if leadValue == 0 {
  300. yData = append(yData, zeroRatio)
  301. }
  302. // 计算领先/滞后N期
  303. if leadValue > 0 {
  304. // 平移变频指标领先/滞后的日期(单位天)
  305. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  306. for i := range xData {
  307. if xData[i] == 0 {
  308. yData = append(yData, zeroRatio)
  309. continue
  310. }
  311. xCalculateData := make([]float64, 0)
  312. yCalculateData := make([]float64, 0)
  313. // 平移指定天数
  314. mDays := int(moveUnitDays) * xData[i]
  315. _, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
  316. // 取出对应的基准日期的值
  317. for i2 := range baseDataTimeArr {
  318. tmpDate := baseDataTimeArr[i2]
  319. if yVal, ok := dMap[tmpDate]; ok {
  320. xCalculateData = append(xCalculateData, baseCalculateData[i2])
  321. yCalculateData = append(yCalculateData, yVal)
  322. }
  323. }
  324. if len(yCalculateData) <= 0 {
  325. //err = fmt.Errorf("领先滞后相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(yCalculateData))
  326. //return
  327. // 领先滞后后,没有可以计算的数据了
  328. continue
  329. }
  330. // 公式计算出领先/滞后频度对应点的相关性系数
  331. ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
  332. yData = append(yData, ratio)
  333. }
  334. }
  335. xEdbIdValue = xData
  336. yDataList = make([]data_manage.YData, 0)
  337. yDate := "0000-00-00"
  338. yDataList = append(yDataList, data_manage.YData{
  339. Date: yDate,
  340. Value: yData,
  341. })
  342. return
  343. }
  344. // RollingCorrelationChartDataResp 滚动相关性图表数据
  345. type RollingCorrelationChartDataResp struct {
  346. MaxData float64
  347. MinData float64
  348. LatestDate string `description:"真实数据的最后日期"`
  349. EdbInfoCategoryType int
  350. ChartColor string
  351. ChartStyle string
  352. PredictChartColor string
  353. ChartType int
  354. ChartWidth int
  355. EdbName string
  356. EdbNameEn string
  357. Unit string
  358. UnitEn string
  359. IsAxis int
  360. DataList []data_manage.EdbDataList
  361. }
  362. // GetRollingCorrelationChartDataByEdbInfo 滚动相关性计算
  363. func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping, leadValue int, leadUnit string, calculateValue int, calculateUnit string, startDate, endDate, chartName, chartNameEn string) (dataResp RollingCorrelationChartDataResp, err error) {
  364. dataResp = RollingCorrelationChartDataResp{
  365. DataList: make([]data_manage.EdbDataList, 0),
  366. MaxData: 0,
  367. MinData: 0,
  368. ChartColor: "#00f",
  369. ChartStyle: `spline`,
  370. PredictChartColor: `#00f`,
  371. ChartType: 0,
  372. ChartWidth: 3,
  373. EdbName: chartName,
  374. EdbNameEn: chartNameEn,
  375. IsAxis: 1,
  376. }
  377. dataList := make([]data_manage.EdbDataList, 0)
  378. // 计算窗口,不包含第一天
  379. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  380. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  381. baseEdbInfo := edbInfoMappingA
  382. changeEdbInfo := edbInfoMappingB
  383. // 获取时间基准指标在时间区间内的值
  384. aDataList := make([]*data_manage.EdbDataList, 0)
  385. switch baseEdbInfo.EdbInfoCategoryType {
  386. case 0:
  387. aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
  388. case 1:
  389. _, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, true)
  390. default:
  391. err = errors.New("指标base类型异常")
  392. return
  393. }
  394. // 获取变频指标所有日期的值, 插值法完善数据
  395. bDataList := make([]*data_manage.EdbDataList, 0)
  396. switch changeEdbInfo.EdbInfoCategoryType {
  397. case 0:
  398. bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
  399. case 1:
  400. _, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  401. default:
  402. err = errors.New("指标change类型异常")
  403. return
  404. }
  405. // 数据平移变频指标领先/滞后的日期(单位天)
  406. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  407. //baseDataList := make([]*data_manage.EdbDataList, 0)
  408. baseDataMap := make(map[string]float64)
  409. changeDataList := make([]*data_manage.EdbDataList, 0)
  410. changeDataMap := make(map[string]float64)
  411. // A指标不管三七二十一,先变个频再说
  412. {
  413. _, e := HandleDataByLinearRegression(aDataList, baseDataMap)
  414. if e != nil {
  415. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  416. return
  417. }
  418. //baseDataList = tmpNewChangeDataList
  419. }
  420. // B指标不管三七二十一,先变个频再说
  421. {
  422. tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  423. if e != nil {
  424. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  425. return
  426. }
  427. changeDataList = tmpNewChangeDataList
  428. // 平移下日期
  429. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  430. _, changeDataMap = MoveDataDaysToNewDataList(changeDataList, leadValue*moveUnitDays)
  431. }
  432. // 计算计算时,需要多少个日期内数据
  433. calculateDay := utils.FrequencyDaysMap[calculateUnit] * calculateValue
  434. // 计算 每个日期的相关性值
  435. {
  436. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  437. if endDate == `` {
  438. endDate = baseEdbInfo.EndDate
  439. }
  440. endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  441. endDateTime = endDateTime.AddDate(0, 0, -(calculateDay - 1))
  442. // 是否开始第一条数据
  443. var isStart, isNotFirst bool
  444. for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
  445. yCalculateData := make([]float64, 0)
  446. baseCalculateData := make([]float64, 0)
  447. // 取出对应的基准日期的值
  448. for i := 0; i < calculateDay; i++ {
  449. iDay := currDay.AddDate(0, 0, i).Format(utils.FormatDate)
  450. tmpBaseValue, ok1 := baseDataMap[iDay]
  451. tmpChangeValue, ok2 := changeDataMap[iDay]
  452. if ok1 && ok2 {
  453. baseCalculateData = append(baseCalculateData, tmpBaseValue)
  454. yCalculateData = append(yCalculateData, tmpChangeValue)
  455. } else {
  456. continue
  457. }
  458. }
  459. // 公式计算出领先/滞后频度对应点的相关性系数
  460. var ratio float64
  461. if len(baseCalculateData) > 0 {
  462. ratio = utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
  463. } else {
  464. // 没有数据的话,那就不返回
  465. continue
  466. }
  467. // 过滤前面都是0的数据
  468. {
  469. if ratio != 0 {
  470. isStart = true
  471. }
  472. if !isStart {
  473. continue
  474. }
  475. }
  476. dataTime := currDay.AddDate(0, 0, calculateDay-1)
  477. dataList = append(dataList, data_manage.EdbDataList{
  478. //EdbDataId: 0,
  479. EdbInfoId: 0,
  480. DataTime: dataTime.Format(utils.FormatDate),
  481. DataTimestamp: dataTime.UnixNano() / 1e6,
  482. Value: ratio,
  483. })
  484. if !isNotFirst {
  485. dataResp.MinData = ratio
  486. dataResp.MaxData = ratio
  487. isNotFirst = true
  488. }
  489. if dataResp.MinData > ratio {
  490. dataResp.MinData = ratio
  491. }
  492. if dataResp.MaxData < ratio {
  493. dataResp.MaxData = ratio
  494. }
  495. }
  496. dataResp.DataList = dataList
  497. }
  498. return
  499. }
  500. // ChartInfoRefresh 图表刷新
  501. func ChartInfoRefresh(chartInfoId int) (err error) {
  502. var errMsg string
  503. defer func() {
  504. if err != nil {
  505. go alarm_msg.SendAlarmMsg("CorrelationChartInfoRefresh: "+errMsg, 3)
  506. }
  507. }()
  508. correlationChart := new(data_manage.ChartInfoCorrelation)
  509. if err = correlationChart.GetItemById(chartInfoId); err != nil {
  510. errMsg = "获取相关性图表失败, Err: " + err.Error()
  511. return
  512. }
  513. // 批量刷新ETA指标
  514. err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false, true)
  515. if err != nil {
  516. return
  517. }
  518. // 重新生成数据并更新
  519. edbInfoMappingA, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
  520. if err != nil {
  521. errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + err.Error()
  522. return
  523. }
  524. edbInfoMappingB, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
  525. if err != nil {
  526. errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + err.Error()
  527. return
  528. }
  529. periodData, correlationData, err := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
  530. if err != nil {
  531. errMsg = "获取相关性图表, 图表计算值失败, Err:" + err.Error()
  532. return
  533. }
  534. periodDataByte, err := json.Marshal(periodData)
  535. if err != nil {
  536. errMsg = "相关性图表, X轴信息有误, Err:" + err.Error()
  537. return
  538. }
  539. correlationDataByte, err := json.Marshal(correlationData[0].Value)
  540. if err != nil {
  541. errMsg = "相关性图表, Y轴信息有误, Err:" + err.Error()
  542. return
  543. }
  544. correlationChart.PeriodData = string(periodDataByte)
  545. correlationChart.CorrelationData = string(correlationDataByte)
  546. correlationChart.ModifyTime = time.Now().Local()
  547. correlationUpdateCols := []string{"PeriodData", "CorrelationData", "ModifyTime"}
  548. if err = correlationChart.Update(correlationUpdateCols); err != nil {
  549. errMsg = "更新相关性图表失败, Err:" + err.Error()
  550. return
  551. }
  552. return
  553. }
  554. // GetChartAndCorrelationInfo 获取图表信息和相关信息信息
  555. func GetChartAndCorrelationInfo(chartInfoId int) (chartInfo *data_manage.ChartInfo, correlationInfo *data_manage.ChartInfoCorrelation, tips string, err error) {
  556. item, e := data_manage.GetChartInfoById(chartInfoId)
  557. if e != nil {
  558. if e.Error() == utils.ErrNoRow() {
  559. tips = "图表已被删除, 请刷新页面"
  560. err = fmt.Errorf("图表已被删除, 请刷新页面")
  561. return
  562. }
  563. err = fmt.Errorf("获取图表信息失败, Err: %s", e.Error())
  564. return
  565. }
  566. if item.Source != utils.CHART_SOURCE_CORRELATION {
  567. tips = "该图不是相关性图表"
  568. err = fmt.Errorf("该图不是相关性图表")
  569. return
  570. }
  571. chartInfo = item
  572. correlationInfo = new(data_manage.ChartInfoCorrelation)
  573. if e = correlationInfo.GetItemById(chartInfo.ChartInfoId); e != nil {
  574. err = fmt.Errorf("获取图表相关性信息失败, Err: %s", e.Error())
  575. return
  576. }
  577. return
  578. }
  579. // AddChartInfo 添加图表
  580. func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  581. isSendEmail = true
  582. req.ChartName = strings.Trim(req.ChartName, " ")
  583. if req.ChartName == "" {
  584. errMsg = "请填写图表名称!"
  585. err = errors.New(errMsg)
  586. isSendEmail = false
  587. return
  588. }
  589. if req.ChartClassifyId <= 0 {
  590. errMsg = "分类参数错误!"
  591. err = errors.New(errMsg)
  592. isSendEmail = false
  593. return
  594. }
  595. // 相关性图表配置
  596. if req.CorrelationChartInfo.LeadValue == 0 && source == utils.CHART_SOURCE_CORRELATION {
  597. errMsg = "请输入领先期数"
  598. err = errors.New(errMsg)
  599. isSendEmail = false
  600. return
  601. }
  602. if req.CorrelationChartInfo.LeadUnit == "" {
  603. errMsg = "请填写领先单位"
  604. err = errors.New(errMsg)
  605. isSendEmail = false
  606. return
  607. }
  608. //if req.CorrelationChartInfo.StartDate == "" || req.CorrelationChartInfo.EndDate == "" {
  609. // errMsg = "请填写开始结束日期"
  610. // err = errors.New(errMsg)
  611. // isSendEmail = false
  612. // return
  613. //}
  614. //startDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.StartDate)
  615. //if e != nil {
  616. // errMsg = "开始日期格式有误"
  617. // err = errors.New(errMsg)
  618. // isSendEmail = false
  619. // return
  620. //}
  621. //endDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.EndDate)
  622. //if e != nil {
  623. // errMsg = "结束日期格式有误"
  624. // err = errors.New(errMsg)
  625. // isSendEmail = false
  626. // return
  627. //}
  628. if len(req.CorrelationChartInfo.EdbInfoIdList) != 2 {
  629. errMsg = "请选择AB指标"
  630. err = errors.New(errMsg)
  631. isSendEmail = false
  632. return
  633. }
  634. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  635. if err != nil {
  636. if err.Error() == utils.ErrNoRow() {
  637. errMsg = "分类不存在"
  638. err = errors.New(errMsg)
  639. isSendEmail = false
  640. return
  641. }
  642. errMsg = "获取分类信息失败"
  643. err = errors.New("获取分类信息失败,Err:" + err.Error())
  644. return
  645. }
  646. if chartClassify == nil {
  647. errMsg = "分类不存在"
  648. err = errors.New(errMsg)
  649. isSendEmail = false
  650. return
  651. }
  652. var edbInfoIdArr []int
  653. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  654. edbInfoId := v.EdbInfoId
  655. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  656. if tmpErr != nil {
  657. if tmpErr.Error() == utils.ErrNoRow() {
  658. errMsg = "指标不存在!"
  659. err = errors.New("指标不存在,edbInfoId:" + strconv.Itoa(edbInfoId))
  660. return
  661. } else {
  662. errMsg = "获取指标信息失败!"
  663. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  664. return
  665. }
  666. }
  667. if edbInfo == nil {
  668. errMsg = "指标已被删除,请重新选择!"
  669. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  670. return
  671. } else {
  672. if edbInfo.EdbInfoId <= 0 {
  673. errMsg = "指标已被删除,请重新选择!"
  674. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  675. return
  676. }
  677. }
  678. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  679. edbInfo.EdbNameSource = edbInfo.EdbName
  680. }
  681. sort.Ints(edbInfoIdArr)
  682. var edbInfoIdArrStr []string
  683. for _, v := range edbInfoIdArr {
  684. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  685. }
  686. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  687. var chartInfoId int
  688. // 判断图表是否存在
  689. var condition string
  690. var pars []interface{}
  691. condition += " AND chart_name=? AND source = ? "
  692. pars = append(pars, req.ChartName, source)
  693. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  694. if err != nil {
  695. errMsg = "判断图表名称是否存在失败"
  696. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  697. return
  698. }
  699. if count > 0 {
  700. errMsg = "图表已存在,请重新填写"
  701. err = errors.New(errMsg)
  702. isSendEmail = false
  703. return
  704. }
  705. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  706. chartInfo = new(data_manage.ChartInfo)
  707. chartInfo.ChartName = req.ChartName
  708. chartInfo.EdbInfoIds = edbInfoIdStr
  709. chartInfo.ChartClassifyId = req.ChartClassifyId
  710. chartInfo.SysUserId = sysUser.AdminId
  711. chartInfo.SysUserRealName = sysUser.RealName
  712. chartInfo.CreateTime = time.Now()
  713. chartInfo.ModifyTime = time.Now()
  714. chartInfo.IsSetName = 0
  715. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  716. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  717. chartInfo.ChartType = 9 // 相关性图
  718. chartInfo.Calendar = "公历"
  719. chartInfo.DateType = 6
  720. chartInfo.StartDate = req.StartDate
  721. chartInfo.EndDate = req.EndDate
  722. chartInfo.SeasonStartDate = req.SeasonStartDate
  723. chartInfo.SeasonEndDate = req.SeasonEndDate
  724. chartInfo.LeftMin = req.LeftMin
  725. chartInfo.LeftMax = req.LeftMax
  726. chartInfo.RightMin = req.RightMin
  727. chartInfo.RightMax = req.RightMax
  728. chartInfo.Disabled = disableVal
  729. chartInfo.Source = source
  730. // 指标信息
  731. mapList := make([]*data_manage.ChartEdbMapping, 0)
  732. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  733. mapItem := new(data_manage.ChartEdbMapping)
  734. mapItem.EdbInfoId = v.EdbInfoId
  735. mapItem.CreateTime = time.Now()
  736. mapItem.ModifyTime = time.Now()
  737. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  738. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
  739. mapItem.IsOrder = true
  740. mapItem.IsAxis = 1
  741. mapItem.EdbInfoType = 1
  742. mapItem.Source = utils.CHART_SOURCE_CORRELATION
  743. mapList = append(mapList, mapItem)
  744. }
  745. // 相关性图表扩展信息
  746. correlationChart := new(data_manage.ChartInfoCorrelation)
  747. correlationChart.LeadValue = req.CorrelationChartInfo.LeadValue
  748. correlationChart.LeadUnit = req.CorrelationChartInfo.LeadUnit
  749. correlationChart.CalculateValue = req.CorrelationChartInfo.CalculateValue
  750. correlationChart.CalculateUnit = req.CorrelationChartInfo.CalculateUnit
  751. correlationChart.BaseCalculateValue = req.CorrelationChartInfo.BaseCalculateValue
  752. correlationChart.BaseCalculateUnit = req.CorrelationChartInfo.BaseCalculateUnit
  753. // 滚动相关性会有日期等信息
  754. if source == utils.CHART_SOURCE_ROLLING_CORRELATION {
  755. correlationChart.DateType = req.CorrelationChartInfo.DateType
  756. if req.CorrelationChartInfo.StartDate != `` {
  757. startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, req.CorrelationChartInfo.StartDate, time.Local)
  758. if tmpErr != nil {
  759. err = tmpErr
  760. return
  761. }
  762. correlationChart.StartDate = startDateTime
  763. }
  764. if req.CorrelationChartInfo.EndDate != `` {
  765. endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, req.CorrelationChartInfo.EndDate, time.Local)
  766. if tmpErr != nil {
  767. err = tmpErr
  768. return
  769. }
  770. correlationChart.EndDate = endDateTime
  771. }
  772. }
  773. correlationChart.EdbInfoIdFirst = req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId
  774. correlationChart.EdbInfoIdSecond = req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId
  775. correlationChart.CreateTime = time.Now().Local()
  776. correlationChart.ModifyTime = time.Now().Local()
  777. //// 生成图表x轴y轴数据
  778. //edbInfoMappingA, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId)
  779. //if e != nil {
  780. // errMsg = "获取失败"
  781. // err = errors.New("获取相关性图表, A指标mapping信息失败, Err:" + e.Error())
  782. // return
  783. //}
  784. //edbInfoMappingB, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId)
  785. //if e != nil {
  786. // errMsg = "获取失败"
  787. // err = errors.New("获取相关性图表, B指标mapping信息失败, Err:" + e.Error())
  788. // return
  789. //}
  790. //periodData, correlationData, e := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, req.CorrelationChartInfo.LeadValue, req.CorrelationChartInfo.LeadUnit, req.CorrelationChartInfo.StartDate, req.CorrelationChartInfo.EndDate)
  791. //if e != nil {
  792. // errMsg = "获取失败"
  793. // err = errors.New("获取相关性图表, 图表计算值失败, Err:" + e.Error())
  794. // return
  795. //}
  796. //periodDataByte, e := json.Marshal(periodData)
  797. //if e != nil {
  798. // errMsg = "获取失败"
  799. // err = errors.New("相关性图表, X轴信息有误, Err:" + e.Error())
  800. // return
  801. //}
  802. //correlationDataByte, e := json.Marshal(correlationData[0].Value)
  803. //if e != nil {
  804. // errMsg = "获取失败"
  805. // err = errors.New("相关性图表, Y轴信息有误, Err:" + e.Error())
  806. // return
  807. //}
  808. //correlationChart.PeriodData = string(periodDataByte)
  809. //correlationChart.CorrelationData = string(correlationDataByte)
  810. // 新增图表和指标mapping
  811. chartInfoId, e := data_manage.CreateCorrelationChartAndEdb(chartInfo, mapList, correlationChart)
  812. if e != nil {
  813. errMsg = "操作失败"
  814. err = errors.New("新增相关性图表失败, Err: " + e.Error())
  815. return
  816. }
  817. //添加es数据
  818. go data.EsAddOrEditChartInfo(chartInfoId)
  819. return
  820. }
  821. // EditChartInfo 编辑图表
  822. func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  823. isSendEmail = true
  824. chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
  825. if err != nil {
  826. if err.Error() == utils.ErrNoRow() {
  827. errMsg = "图表已被删除,请刷新页面"
  828. err = errors.New(errMsg)
  829. isSendEmail = false
  830. return
  831. }
  832. errMsg = "获取图表信息失败"
  833. err = errors.New("获取图表信息失败,Err:" + err.Error())
  834. return
  835. }
  836. if chartItem.Source != utils.CHART_SOURCE_CORRELATION && chartItem.Source != utils.CHART_SOURCE_ROLLING_CORRELATION {
  837. errMsg = "该图不是相关性图表!"
  838. err = errors.New(errMsg)
  839. isSendEmail = false
  840. return
  841. }
  842. req.ChartName = strings.Trim(req.ChartName, " ")
  843. if req.ChartClassifyId <= 0 {
  844. errMsg = "分类参数错误!"
  845. err = errors.New(errMsg)
  846. isSendEmail = false
  847. return
  848. }
  849. // 相关性图表配置
  850. if req.CorrelationChartInfo.LeadValue == 0 && chartItem.Source == utils.CHART_SOURCE_CORRELATION {
  851. errMsg = "请输入领先期数"
  852. err = errors.New(errMsg)
  853. isSendEmail = false
  854. return
  855. }
  856. if req.CorrelationChartInfo.LeadUnit == "" {
  857. errMsg = "请填写领先单位"
  858. err = errors.New(errMsg)
  859. isSendEmail = false
  860. return
  861. }
  862. //if req.CorrelationChartInfo.StartDate == "" || req.CorrelationChartInfo.EndDate == "" {
  863. // errMsg = "请填写开始结束日期"
  864. // err = errors.New(errMsg)
  865. // isSendEmail = false
  866. // return
  867. //}
  868. startDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.StartDate)
  869. if e != nil {
  870. errMsg = "开始日期格式有误"
  871. err = errors.New(errMsg)
  872. isSendEmail = false
  873. return
  874. }
  875. endDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.EndDate)
  876. if e != nil {
  877. errMsg = "结束日期格式有误"
  878. err = errors.New(errMsg)
  879. isSendEmail = false
  880. return
  881. }
  882. if len(req.CorrelationChartInfo.EdbInfoIdList) != 2 {
  883. errMsg = "请选择AB指标"
  884. err = errors.New(errMsg)
  885. isSendEmail = false
  886. return
  887. }
  888. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  889. if err != nil {
  890. if err.Error() == utils.ErrNoRow() {
  891. errMsg = "分类不存在"
  892. err = errors.New(errMsg)
  893. isSendEmail = false
  894. return
  895. }
  896. errMsg = "获取分类信息失败"
  897. err = errors.New("获取分类信息失败,Err:" + err.Error())
  898. return
  899. }
  900. if chartClassify == nil {
  901. errMsg = "分类不存在"
  902. err = errors.New(errMsg)
  903. isSendEmail = false
  904. return
  905. }
  906. // 图表操作权限
  907. ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
  908. if !ok {
  909. errMsg = "没有该图表的操作权限"
  910. err = errors.New(errMsg)
  911. isSendEmail = false
  912. return
  913. }
  914. var edbInfoIdArr []int
  915. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  916. edbInfoId := v.EdbInfoId
  917. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  918. if tmpErr != nil {
  919. if tmpErr.Error() == utils.ErrNoRow() {
  920. errMsg = "图表不存在!"
  921. err = errors.New("图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  922. return
  923. } else {
  924. errMsg = "获取图表信息失败!"
  925. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  926. return
  927. }
  928. }
  929. if edbInfo == nil {
  930. errMsg = "指标不存在!"
  931. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  932. return
  933. }
  934. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  935. }
  936. sort.Ints(edbInfoIdArr)
  937. var edbInfoIdArrStr []string
  938. for _, v := range edbInfoIdArr {
  939. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  940. }
  941. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  942. //判断图表是否存在
  943. var condition string
  944. var pars []interface{}
  945. condition += " AND chart_info_id <> ? "
  946. pars = append(pars, req.ChartInfoId)
  947. condition += " AND chart_name=? AND source = ? "
  948. pars = append(pars, req.ChartName, chartItem.Source)
  949. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  950. if err != nil {
  951. errMsg = "判断图表名称是否存在失败"
  952. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  953. return
  954. }
  955. if count > 0 {
  956. errMsg = "图表已存在,请重新填写"
  957. err = errors.New(errMsg)
  958. isSendEmail = false
  959. return
  960. }
  961. correlationChart := new(data_manage.ChartInfoCorrelation)
  962. if e := correlationChart.GetItemById(chartItem.ChartInfoId); e != nil {
  963. errMsg = "操作失败"
  964. err = errors.New("图表相关性信息不存在, Err: " + e.Error())
  965. return
  966. }
  967. // 图表启用与否
  968. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  969. // 重新生成图表值, 并修改相关性图表扩展信息
  970. //edbInfoMappingA, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId)
  971. //if e != nil {
  972. // errMsg = "获取失败"
  973. // err = errors.New("获取相关性图表, A指标mapping信息失败, Err:" + e.Error())
  974. // return
  975. //}
  976. //edbInfoMappingB, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId)
  977. //if e != nil {
  978. // errMsg = "获取失败"
  979. // err = errors.New("获取相关性图表, B指标mapping信息失败, Err:" + e.Error())
  980. // return
  981. //}
  982. //periodData, correlationData, e := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, req.CorrelationChartInfo.LeadValue, req.CorrelationChartInfo.LeadUnit, req.CorrelationChartInfo.StartDate, req.CorrelationChartInfo.EndDate)
  983. //if e != nil {
  984. // errMsg = "获取失败"
  985. // err = errors.New("获取相关性图表, 图表计算值失败, Err:" + e.Error())
  986. // return
  987. //}
  988. //periodDataByte, e := json.Marshal(periodData)
  989. //if e != nil {
  990. // errMsg = "获取失败"
  991. // err = errors.New("相关性图表, X轴信息有误, Err:" + e.Error())
  992. // return
  993. //}
  994. //correlationDataByte, e := json.Marshal(correlationData[0].Value)
  995. //if e != nil {
  996. // errMsg = "获取失败"
  997. // err = errors.New("相关性图表, Y轴信息有误, Err:" + e.Error())
  998. // return
  999. //}
  1000. correlationChart.LeadValue = req.CorrelationChartInfo.LeadValue
  1001. correlationChart.LeadUnit = req.CorrelationChartInfo.LeadUnit
  1002. correlationChart.CalculateValue = req.CorrelationChartInfo.CalculateValue
  1003. correlationChart.CalculateUnit = req.CorrelationChartInfo.CalculateUnit
  1004. correlationChart.StartDate = startDate
  1005. correlationChart.EndDate = endDate
  1006. correlationChart.EdbInfoIdFirst = req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId
  1007. correlationChart.EdbInfoIdSecond = req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId
  1008. // 滚动相关性会有日期等信息
  1009. if chartItem.Source == utils.CHART_SOURCE_ROLLING_CORRELATION {
  1010. correlationChart.DateType = req.CorrelationChartInfo.DateType
  1011. }
  1012. //correlationChart.PeriodData = string(periodDataByte)
  1013. //correlationChart.CorrelationData = string(correlationDataByte)
  1014. correlationChart.ModifyTime = time.Now().Local()
  1015. //correlationUpdateCols := []string{"LeadValue", "LeadUnit", "StartDate", "EndDate", "EdbInfoIdFirst", "EdbInfoIdSecond", "PeriodData","CorrelationData", "ModifyTime"}
  1016. correlationUpdateCols := []string{"LeadValue", "LeadUnit", "CalculateValue", "CalculateUnit", "DateType", "StartDate", "EndDate", "EdbInfoIdFirst", "EdbInfoIdSecond", "ModifyTime"}
  1017. // 修改图表与指标mapping
  1018. req.ChartType = 9
  1019. err = data_manage.EditCorrelationChartInfoAndMapping(&req, edbInfoIdStr, "公历", 6, disableVal, ``,
  1020. correlationChart, correlationUpdateCols)
  1021. if err != nil {
  1022. errMsg = "保存失败"
  1023. err = errors.New("保存失败,Err:" + err.Error())
  1024. return
  1025. }
  1026. resp := new(data_manage.AddChartInfoResp)
  1027. resp.ChartInfoId = chartItem.ChartInfoId
  1028. resp.UniqueCode = chartItem.UniqueCode
  1029. resp.ChartType = req.ChartType
  1030. //添加es数据
  1031. go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
  1032. //修改my eta es数据
  1033. go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
  1034. return
  1035. }
  1036. // CopyChartInfo 复制图表
  1037. func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  1038. configSource := 2
  1039. isSendEmail = true
  1040. // 获取相关性图的配置
  1041. multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(configId, configSource)
  1042. if err != nil {
  1043. return
  1044. }
  1045. multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
  1046. if err != nil {
  1047. return
  1048. }
  1049. multipleGraphConfig.MultipleGraphConfigId = 0
  1050. err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
  1051. if err != nil {
  1052. return
  1053. }
  1054. // 添加图
  1055. addChartReq := data_manage.AddChartInfoReq{
  1056. ChartClassifyId: classifyId,
  1057. ChartName: chartName,
  1058. ChartType: utils.CHART_TYPE_CURVE,
  1059. Calendar: "公历",
  1060. CorrelationChartInfo: correlationChartInfoReq,
  1061. }
  1062. chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
  1063. chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)
  1064. if err != nil {
  1065. return
  1066. }
  1067. // 添加关系
  1068. multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
  1069. //Id: 0,
  1070. MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
  1071. ChartInfoId: chartInfo.ChartInfoId,
  1072. Source: configSource,
  1073. ModifyTime: time.Now(),
  1074. CreateTime: time.Now(),
  1075. }
  1076. err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
  1077. if err != nil {
  1078. return
  1079. }
  1080. //添加es数据
  1081. go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  1082. return
  1083. }