chart_info.go 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  1. package correlation
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/shopspring/decimal"
  7. "hongze/hz_eta_api/models/data_manage"
  8. "hongze/hz_eta_api/models/system"
  9. "hongze/hz_eta_api/services/alarm_msg"
  10. "hongze/hz_eta_api/services/data"
  11. "hongze/hz_eta_api/utils"
  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(aDataList, baseDataMap)
  251. if e != nil {
  252. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  253. return
  254. }
  255. baseDataList = tmpNewChangeDataList
  256. } else {
  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(bDataList, changeDataMap)
  265. if e != nil {
  266. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  267. return
  268. }
  269. changeDataList = tmpNewChangeDataList
  270. } else {
  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. // GetRollingCorrelationChartDataByEdbInfo 滚动相关性计算
  345. func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping, leadValue int, leadUnit string, calculateValue int, calculateUnit string, startDate, endDate string) (dataList []data_manage.EdbDataList, err error) {
  346. dataList = make([]data_manage.EdbDataList, 0)
  347. // 计算窗口,不包含第一天
  348. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  349. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  350. baseEdbInfo := edbInfoMappingA
  351. changeEdbInfo := edbInfoMappingB
  352. // 获取时间基准指标在时间区间内的值
  353. aDataList := make([]*data_manage.EdbDataList, 0)
  354. switch baseEdbInfo.EdbInfoCategoryType {
  355. case 0:
  356. aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
  357. case 1:
  358. _, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, true)
  359. default:
  360. err = errors.New("指标base类型异常")
  361. return
  362. }
  363. // 获取变频指标所有日期的值, 插值法完善数据
  364. bDataList := make([]*data_manage.EdbDataList, 0)
  365. switch changeEdbInfo.EdbInfoCategoryType {
  366. case 0:
  367. bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
  368. case 1:
  369. _, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  370. default:
  371. err = errors.New("指标change类型异常")
  372. return
  373. }
  374. // 数据平移变频指标领先/滞后的日期(单位天)
  375. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  376. //baseDataList := make([]*data_manage.EdbDataList, 0)
  377. baseDataMap := make(map[string]float64)
  378. changeDataList := make([]*data_manage.EdbDataList, 0)
  379. changeDataMap := make(map[string]float64)
  380. // A指标不管三七二十一,先变个频再说
  381. {
  382. _, e := HandleDataByLinearRegression(aDataList, baseDataMap)
  383. if e != nil {
  384. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  385. return
  386. }
  387. //baseDataList = tmpNewChangeDataList
  388. }
  389. // B指标不管三七二十一,先变个频再说
  390. {
  391. tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  392. if e != nil {
  393. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  394. return
  395. }
  396. changeDataList = tmpNewChangeDataList
  397. // 平移下日期
  398. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  399. _, changeDataMap = MoveDataDaysToNewDataList(changeDataList, leadValue*moveUnitDays)
  400. }
  401. // 计算计算时,需要多少个日期内数据
  402. calculateDay := utils.FrequencyDaysMap[calculateUnit] * calculateValue
  403. // 计算 每个日期的相关性值
  404. {
  405. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  406. if endDate == `` {
  407. endDate = baseEdbInfo.EndDate
  408. }
  409. endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  410. endDateTime = endDateTime.AddDate(0, 0, -(calculateDay - 1))
  411. isStart := false
  412. for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
  413. yCalculateData := make([]float64, 0)
  414. baseCalculateData := make([]float64, 0)
  415. // 取出对应的基准日期的值
  416. for i := 0; i < calculateDay; i++ {
  417. iDay := currDay.AddDate(0, 0, i).Format(utils.FormatDate)
  418. tmpBaseValue, ok1 := baseDataMap[iDay]
  419. tmpChangeValue, ok2 := changeDataMap[iDay]
  420. if ok1 && ok2 {
  421. baseCalculateData = append(baseCalculateData, tmpBaseValue)
  422. yCalculateData = append(yCalculateData, tmpChangeValue)
  423. } else {
  424. continue
  425. }
  426. }
  427. // 公式计算出领先/滞后频度对应点的相关性系数
  428. var ratio float64
  429. if len(baseCalculateData) > 0 {
  430. ratio = utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
  431. } else {
  432. // 没有数据的话,那就不返回
  433. continue
  434. }
  435. // 过滤前面都是0的数据
  436. {
  437. if ratio != 0 {
  438. isStart = true
  439. }
  440. if !isStart {
  441. continue
  442. }
  443. }
  444. dataTime := currDay.AddDate(0, 0, calculateDay-1)
  445. dataList = append(dataList, data_manage.EdbDataList{
  446. //EdbDataId: 0,
  447. EdbInfoId: 0,
  448. DataTime: dataTime.Format(utils.FormatDate),
  449. DataTimestamp: dataTime.UnixNano() / 1e6,
  450. Value: ratio,
  451. })
  452. }
  453. }
  454. return
  455. }
  456. // ChartInfoRefresh 图表刷新
  457. func ChartInfoRefresh(chartInfoId int) (err error) {
  458. var errMsg string
  459. defer func() {
  460. if err != nil {
  461. go alarm_msg.SendAlarmMsg("CorrelationChartInfoRefresh: "+errMsg, 3)
  462. }
  463. }()
  464. correlationChart := new(data_manage.ChartInfoCorrelation)
  465. if err = correlationChart.GetItemById(chartInfoId); err != nil {
  466. errMsg = "获取相关性图表失败, Err: " + err.Error()
  467. return
  468. }
  469. // 批量刷新ETA指标
  470. err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false, true)
  471. if err != nil {
  472. return
  473. }
  474. // 重新生成数据并更新
  475. edbInfoMappingA, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
  476. if err != nil {
  477. errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + err.Error()
  478. return
  479. }
  480. edbInfoMappingB, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
  481. if err != nil {
  482. errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + err.Error()
  483. return
  484. }
  485. periodData, correlationData, err := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
  486. if err != nil {
  487. errMsg = "获取相关性图表, 图表计算值失败, Err:" + err.Error()
  488. return
  489. }
  490. periodDataByte, err := json.Marshal(periodData)
  491. if err != nil {
  492. errMsg = "相关性图表, X轴信息有误, Err:" + err.Error()
  493. return
  494. }
  495. correlationDataByte, err := json.Marshal(correlationData[0].Value)
  496. if err != nil {
  497. errMsg = "相关性图表, Y轴信息有误, Err:" + err.Error()
  498. return
  499. }
  500. correlationChart.PeriodData = string(periodDataByte)
  501. correlationChart.CorrelationData = string(correlationDataByte)
  502. correlationChart.ModifyTime = time.Now().Local()
  503. correlationUpdateCols := []string{"PeriodData", "CorrelationData", "ModifyTime"}
  504. if err = correlationChart.Update(correlationUpdateCols); err != nil {
  505. errMsg = "更新相关性图表失败, Err:" + err.Error()
  506. return
  507. }
  508. return
  509. }
  510. // GetChartAndCorrelationInfo 获取图表信息和相关信息信息
  511. func GetChartAndCorrelationInfo(chartInfoId int) (chartInfo *data_manage.ChartInfo, correlationInfo *data_manage.ChartInfoCorrelation, tips string, err error) {
  512. item, e := data_manage.GetChartInfoById(chartInfoId)
  513. if e != nil {
  514. if e.Error() == utils.ErrNoRow() {
  515. tips = "图表已被删除, 请刷新页面"
  516. err = fmt.Errorf("图表已被删除, 请刷新页面")
  517. return
  518. }
  519. err = fmt.Errorf("获取图表信息失败, Err: %s", e.Error())
  520. return
  521. }
  522. if item.Source != utils.CHART_SOURCE_CORRELATION {
  523. tips = "该图不是相关性图表"
  524. err = fmt.Errorf("该图不是相关性图表")
  525. return
  526. }
  527. chartInfo = item
  528. correlationInfo = new(data_manage.ChartInfoCorrelation)
  529. if e = correlationInfo.GetItemById(chartInfo.ChartInfoId); e != nil {
  530. err = fmt.Errorf("获取图表相关性信息失败, Err: %s", e.Error())
  531. return
  532. }
  533. return
  534. }
  535. // AddChartInfo 添加图表
  536. func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  537. isSendEmail = true
  538. req.ChartName = strings.Trim(req.ChartName, " ")
  539. if req.ChartName == "" {
  540. errMsg = "请填写图表名称!"
  541. err = errors.New(errMsg)
  542. isSendEmail = false
  543. return
  544. }
  545. if req.ChartClassifyId <= 0 {
  546. errMsg = "分类参数错误!"
  547. err = errors.New(errMsg)
  548. isSendEmail = false
  549. return
  550. }
  551. // 相关性图表配置
  552. if req.CorrelationChartInfo.LeadValue == 0 && source == utils.CHART_SOURCE_CORRELATION {
  553. errMsg = "请输入领先期数"
  554. err = errors.New(errMsg)
  555. isSendEmail = false
  556. return
  557. }
  558. if req.CorrelationChartInfo.LeadUnit == "" {
  559. errMsg = "请填写领先单位"
  560. err = errors.New(errMsg)
  561. isSendEmail = false
  562. return
  563. }
  564. //if req.CorrelationChartInfo.StartDate == "" || req.CorrelationChartInfo.EndDate == "" {
  565. // errMsg = "请填写开始结束日期"
  566. // err = errors.New(errMsg)
  567. // isSendEmail = false
  568. // return
  569. //}
  570. //startDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.StartDate)
  571. //if e != nil {
  572. // errMsg = "开始日期格式有误"
  573. // err = errors.New(errMsg)
  574. // isSendEmail = false
  575. // return
  576. //}
  577. //endDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.EndDate)
  578. //if e != nil {
  579. // errMsg = "结束日期格式有误"
  580. // err = errors.New(errMsg)
  581. // isSendEmail = false
  582. // return
  583. //}
  584. if len(req.CorrelationChartInfo.EdbInfoIdList) != 2 {
  585. errMsg = "请选择AB指标"
  586. err = errors.New(errMsg)
  587. isSendEmail = false
  588. return
  589. }
  590. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  591. if err != nil {
  592. if err.Error() == utils.ErrNoRow() {
  593. errMsg = "分类不存在"
  594. err = errors.New(errMsg)
  595. isSendEmail = false
  596. return
  597. }
  598. errMsg = "获取分类信息失败"
  599. err = errors.New("获取分类信息失败,Err:" + err.Error())
  600. return
  601. }
  602. if chartClassify == nil {
  603. errMsg = "分类不存在"
  604. err = errors.New(errMsg)
  605. isSendEmail = false
  606. return
  607. }
  608. var edbInfoIdArr []int
  609. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  610. edbInfoId := v.EdbInfoId
  611. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  612. if tmpErr != nil {
  613. if tmpErr.Error() == utils.ErrNoRow() {
  614. errMsg = "指标不存在!"
  615. err = errors.New("指标不存在,edbInfoId:" + strconv.Itoa(edbInfoId))
  616. return
  617. } else {
  618. errMsg = "获取指标信息失败!"
  619. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  620. return
  621. }
  622. }
  623. if edbInfo == nil {
  624. errMsg = "指标已被删除,请重新选择!"
  625. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  626. return
  627. } else {
  628. if edbInfo.EdbInfoId <= 0 {
  629. errMsg = "指标已被删除,请重新选择!"
  630. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  631. return
  632. }
  633. }
  634. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  635. edbInfo.EdbNameSource = edbInfo.EdbName
  636. }
  637. sort.Ints(edbInfoIdArr)
  638. var edbInfoIdArrStr []string
  639. for _, v := range edbInfoIdArr {
  640. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  641. }
  642. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  643. var chartInfoId int
  644. // 判断图表是否存在
  645. var condition string
  646. var pars []interface{}
  647. condition += " AND chart_name=? AND source = ? "
  648. pars = append(pars, req.ChartName, source)
  649. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  650. if err != nil {
  651. errMsg = "判断图表名称是否存在失败"
  652. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  653. return
  654. }
  655. if count > 0 {
  656. errMsg = "图表已存在,请重新填写"
  657. err = errors.New(errMsg)
  658. isSendEmail = false
  659. return
  660. }
  661. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  662. chartInfo = new(data_manage.ChartInfo)
  663. chartInfo.ChartName = req.ChartName
  664. chartInfo.EdbInfoIds = edbInfoIdStr
  665. chartInfo.ChartClassifyId = req.ChartClassifyId
  666. chartInfo.SysUserId = sysUser.AdminId
  667. chartInfo.SysUserRealName = sysUser.RealName
  668. chartInfo.CreateTime = time.Now()
  669. chartInfo.ModifyTime = time.Now()
  670. chartInfo.IsSetName = 0
  671. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  672. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  673. chartInfo.ChartType = 9 // 相关性图
  674. chartInfo.Calendar = "公历"
  675. chartInfo.DateType = 6
  676. chartInfo.StartDate = req.StartDate
  677. chartInfo.EndDate = req.EndDate
  678. chartInfo.SeasonStartDate = req.SeasonStartDate
  679. chartInfo.SeasonEndDate = req.SeasonEndDate
  680. chartInfo.LeftMin = req.LeftMin
  681. chartInfo.LeftMax = req.LeftMax
  682. chartInfo.RightMin = req.RightMin
  683. chartInfo.RightMax = req.RightMax
  684. chartInfo.Disabled = disableVal
  685. chartInfo.Source = source
  686. // 指标信息
  687. mapList := make([]*data_manage.ChartEdbMapping, 0)
  688. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  689. mapItem := new(data_manage.ChartEdbMapping)
  690. mapItem.EdbInfoId = v.EdbInfoId
  691. mapItem.CreateTime = time.Now()
  692. mapItem.ModifyTime = time.Now()
  693. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  694. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
  695. mapItem.IsOrder = true
  696. mapItem.IsAxis = 1
  697. mapItem.EdbInfoType = 1
  698. mapItem.Source = utils.CHART_SOURCE_CORRELATION
  699. mapList = append(mapList, mapItem)
  700. }
  701. // 相关性图表扩展信息
  702. correlationChart := new(data_manage.ChartInfoCorrelation)
  703. correlationChart.LeadValue = req.CorrelationChartInfo.LeadValue
  704. correlationChart.LeadUnit = req.CorrelationChartInfo.LeadUnit
  705. correlationChart.CalculateValue = req.CorrelationChartInfo.CalculateValue
  706. correlationChart.CalculateUnit = req.CorrelationChartInfo.CalculateUnit
  707. correlationChart.BaseCalculateValue = req.CorrelationChartInfo.BaseCalculateValue
  708. correlationChart.BaseCalculateUnit = req.CorrelationChartInfo.BaseCalculateUnit
  709. // 滚动相关性会有日期等信息
  710. if source == utils.CHART_SOURCE_ROLLING_CORRELATION {
  711. correlationChart.DateType = req.CorrelationChartInfo.DateType
  712. if req.CorrelationChartInfo.StartDate != `` {
  713. startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, req.CorrelationChartInfo.StartDate, time.Local)
  714. if tmpErr != nil {
  715. err = tmpErr
  716. return
  717. }
  718. correlationChart.StartDate = startDateTime
  719. }
  720. if req.CorrelationChartInfo.EndDate != `` {
  721. endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, req.CorrelationChartInfo.EndDate, time.Local)
  722. if tmpErr != nil {
  723. err = tmpErr
  724. return
  725. }
  726. correlationChart.EndDate = endDateTime
  727. }
  728. }
  729. correlationChart.EdbInfoIdFirst = req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId
  730. correlationChart.EdbInfoIdSecond = req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId
  731. correlationChart.CreateTime = time.Now().Local()
  732. correlationChart.ModifyTime = time.Now().Local()
  733. //// 生成图表x轴y轴数据
  734. //edbInfoMappingA, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId)
  735. //if e != nil {
  736. // errMsg = "获取失败"
  737. // err = errors.New("获取相关性图表, A指标mapping信息失败, Err:" + e.Error())
  738. // return
  739. //}
  740. //edbInfoMappingB, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId)
  741. //if e != nil {
  742. // errMsg = "获取失败"
  743. // err = errors.New("获取相关性图表, B指标mapping信息失败, Err:" + e.Error())
  744. // return
  745. //}
  746. //periodData, correlationData, e := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, req.CorrelationChartInfo.LeadValue, req.CorrelationChartInfo.LeadUnit, req.CorrelationChartInfo.StartDate, req.CorrelationChartInfo.EndDate)
  747. //if e != nil {
  748. // errMsg = "获取失败"
  749. // err = errors.New("获取相关性图表, 图表计算值失败, Err:" + e.Error())
  750. // return
  751. //}
  752. //periodDataByte, e := json.Marshal(periodData)
  753. //if e != nil {
  754. // errMsg = "获取失败"
  755. // err = errors.New("相关性图表, X轴信息有误, Err:" + e.Error())
  756. // return
  757. //}
  758. //correlationDataByte, e := json.Marshal(correlationData[0].Value)
  759. //if e != nil {
  760. // errMsg = "获取失败"
  761. // err = errors.New("相关性图表, Y轴信息有误, Err:" + e.Error())
  762. // return
  763. //}
  764. //correlationChart.PeriodData = string(periodDataByte)
  765. //correlationChart.CorrelationData = string(correlationDataByte)
  766. // 新增图表和指标mapping
  767. chartInfoId, e := data_manage.CreateCorrelationChartAndEdb(chartInfo, mapList, correlationChart)
  768. if e != nil {
  769. errMsg = "操作失败"
  770. err = errors.New("新增相关性图表失败, Err: " + e.Error())
  771. return
  772. }
  773. //添加es数据
  774. go data.EsAddOrEditChartInfo(chartInfoId)
  775. return
  776. }
  777. // EditChartInfo 编辑图表
  778. func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  779. isSendEmail = true
  780. chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
  781. if err != nil {
  782. if err.Error() == utils.ErrNoRow() {
  783. errMsg = "图表已被删除,请刷新页面"
  784. err = errors.New(errMsg)
  785. isSendEmail = false
  786. return
  787. }
  788. errMsg = "获取图表信息失败"
  789. err = errors.New("获取图表信息失败,Err:" + err.Error())
  790. return
  791. }
  792. if chartItem.Source != utils.CHART_SOURCE_CORRELATION && chartItem.Source != utils.CHART_SOURCE_ROLLING_CORRELATION {
  793. errMsg = "该图不是相关性图表!"
  794. err = errors.New(errMsg)
  795. isSendEmail = false
  796. return
  797. }
  798. req.ChartName = strings.Trim(req.ChartName, " ")
  799. if req.ChartClassifyId <= 0 {
  800. errMsg = "分类参数错误!"
  801. err = errors.New(errMsg)
  802. isSendEmail = false
  803. return
  804. }
  805. // 相关性图表配置
  806. if req.CorrelationChartInfo.LeadValue == 0 && chartItem.Source == utils.CHART_SOURCE_CORRELATION {
  807. errMsg = "请输入领先期数"
  808. err = errors.New(errMsg)
  809. isSendEmail = false
  810. return
  811. }
  812. if req.CorrelationChartInfo.LeadUnit == "" {
  813. errMsg = "请填写领先单位"
  814. err = errors.New(errMsg)
  815. isSendEmail = false
  816. return
  817. }
  818. //if req.CorrelationChartInfo.StartDate == "" || req.CorrelationChartInfo.EndDate == "" {
  819. // errMsg = "请填写开始结束日期"
  820. // err = errors.New(errMsg)
  821. // isSendEmail = false
  822. // return
  823. //}
  824. startDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.StartDate)
  825. if e != nil {
  826. errMsg = "开始日期格式有误"
  827. err = errors.New(errMsg)
  828. isSendEmail = false
  829. return
  830. }
  831. endDate, e := time.Parse(utils.FormatDate, req.CorrelationChartInfo.EndDate)
  832. if e != nil {
  833. errMsg = "结束日期格式有误"
  834. err = errors.New(errMsg)
  835. isSendEmail = false
  836. return
  837. }
  838. if len(req.CorrelationChartInfo.EdbInfoIdList) != 2 {
  839. errMsg = "请选择AB指标"
  840. err = errors.New(errMsg)
  841. isSendEmail = false
  842. return
  843. }
  844. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  845. if err != nil {
  846. if err.Error() == utils.ErrNoRow() {
  847. errMsg = "分类不存在"
  848. err = errors.New(errMsg)
  849. isSendEmail = false
  850. return
  851. }
  852. errMsg = "获取分类信息失败"
  853. err = errors.New("获取分类信息失败,Err:" + err.Error())
  854. return
  855. }
  856. if chartClassify == nil {
  857. errMsg = "分类不存在"
  858. err = errors.New(errMsg)
  859. isSendEmail = false
  860. return
  861. }
  862. // 图表操作权限
  863. ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
  864. if !ok {
  865. errMsg = "没有该图表的操作权限"
  866. err = errors.New(errMsg)
  867. isSendEmail = false
  868. return
  869. }
  870. var edbInfoIdArr []int
  871. for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
  872. edbInfoId := v.EdbInfoId
  873. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  874. if tmpErr != nil {
  875. if tmpErr.Error() == utils.ErrNoRow() {
  876. errMsg = "图表不存在!"
  877. err = errors.New("图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  878. return
  879. } else {
  880. errMsg = "获取图表信息失败!"
  881. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  882. return
  883. }
  884. }
  885. if edbInfo == nil {
  886. errMsg = "指标不存在!"
  887. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  888. return
  889. }
  890. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  891. }
  892. sort.Ints(edbInfoIdArr)
  893. var edbInfoIdArrStr []string
  894. for _, v := range edbInfoIdArr {
  895. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  896. }
  897. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  898. //判断图表是否存在
  899. var condition string
  900. var pars []interface{}
  901. condition += " AND chart_info_id <> ? "
  902. pars = append(pars, req.ChartInfoId)
  903. condition += " AND chart_name=? AND source = ? "
  904. pars = append(pars, req.ChartName, chartItem.Source)
  905. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  906. if err != nil {
  907. errMsg = "判断图表名称是否存在失败"
  908. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  909. return
  910. }
  911. if count > 0 {
  912. errMsg = "图表已存在,请重新填写"
  913. err = errors.New(errMsg)
  914. isSendEmail = false
  915. return
  916. }
  917. correlationChart := new(data_manage.ChartInfoCorrelation)
  918. if e := correlationChart.GetItemById(chartItem.ChartInfoId); e != nil {
  919. errMsg = "操作失败"
  920. err = errors.New("图表相关性信息不存在, Err: " + e.Error())
  921. return
  922. }
  923. // 图表启用与否
  924. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  925. // 重新生成图表值, 并修改相关性图表扩展信息
  926. //edbInfoMappingA, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[0].EdbInfoId)
  927. //if e != nil {
  928. // errMsg = "获取失败"
  929. // err = errors.New("获取相关性图表, A指标mapping信息失败, Err:" + e.Error())
  930. // return
  931. //}
  932. //edbInfoMappingB, e := data_manage.GetChartEdbMappingByEdbInfoId(req.CorrelationChartInfo.EdbInfoIdList[1].EdbInfoId)
  933. //if e != nil {
  934. // errMsg = "获取失败"
  935. // err = errors.New("获取相关性图表, B指标mapping信息失败, Err:" + e.Error())
  936. // return
  937. //}
  938. //periodData, correlationData, e := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, req.CorrelationChartInfo.LeadValue, req.CorrelationChartInfo.LeadUnit, req.CorrelationChartInfo.StartDate, req.CorrelationChartInfo.EndDate)
  939. //if e != nil {
  940. // errMsg = "获取失败"
  941. // err = errors.New("获取相关性图表, 图表计算值失败, Err:" + e.Error())
  942. // return
  943. //}
  944. //periodDataByte, e := json.Marshal(periodData)
  945. //if e != nil {
  946. // errMsg = "获取失败"
  947. // err = errors.New("相关性图表, X轴信息有误, Err:" + e.Error())
  948. // return
  949. //}
  950. //correlationDataByte, e := json.Marshal(correlationData[0].Value)
  951. //if e != nil {
  952. // errMsg = "获取失败"
  953. // err = errors.New("相关性图表, Y轴信息有误, Err:" + e.Error())
  954. // return
  955. //}
  956. correlationChart.LeadValue = req.CorrelationChartInfo.LeadValue
  957. correlationChart.LeadUnit = req.CorrelationChartInfo.LeadUnit
  958. correlationChart.CalculateValue = req.CorrelationChartInfo.CalculateValue
  959. correlationChart.CalculateUnit = req.CorrelationChartInfo.CalculateUnit
  960. correlationChart.StartDate = startDate
  961. correlationChart.EndDate = endDate
  962. correlationChart.EdbInfoIdFirst = edbInfoIdArr[0]
  963. correlationChart.EdbInfoIdSecond = edbInfoIdArr[1]
  964. // 滚动相关性会有日期等信息
  965. if chartItem.Source == utils.CHART_SOURCE_ROLLING_CORRELATION {
  966. correlationChart.DateType = req.CorrelationChartInfo.DateType
  967. }
  968. //correlationChart.PeriodData = string(periodDataByte)
  969. //correlationChart.CorrelationData = string(correlationDataByte)
  970. correlationChart.ModifyTime = time.Now().Local()
  971. //correlationUpdateCols := []string{"LeadValue", "LeadUnit", "StartDate", "EndDate", "EdbInfoIdFirst", "EdbInfoIdSecond", "PeriodData","CorrelationData", "ModifyTime"}
  972. correlationUpdateCols := []string{"LeadValue", "LeadUnit", "CalculateValue", "CalculateUnit", "DateType", "StartDate", "EndDate", "EdbInfoIdFirst", "EdbInfoIdSecond", "ModifyTime"}
  973. // 修改图表与指标mapping
  974. req.ChartType = 9
  975. err = data_manage.EditCorrelationChartInfoAndMapping(&req, edbInfoIdStr, "公历", 6, disableVal, ``,
  976. correlationChart, correlationUpdateCols)
  977. if err != nil {
  978. errMsg = "保存失败"
  979. err = errors.New("保存失败,Err:" + err.Error())
  980. return
  981. }
  982. resp := new(data_manage.AddChartInfoResp)
  983. resp.ChartInfoId = chartItem.ChartInfoId
  984. resp.UniqueCode = chartItem.UniqueCode
  985. resp.ChartType = req.ChartType
  986. //添加es数据
  987. go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
  988. //修改my eta es数据
  989. go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
  990. return
  991. }
  992. // CopyChartInfo 复制图表
  993. func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  994. configSource := 2
  995. isSendEmail = true
  996. // 获取相关性图的配置
  997. multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(configId, configSource)
  998. if err != nil {
  999. return
  1000. }
  1001. multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
  1002. if err != nil {
  1003. return
  1004. }
  1005. multipleGraphConfig.MultipleGraphConfigId = 0
  1006. err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
  1007. if err != nil {
  1008. return
  1009. }
  1010. // 添加图
  1011. addChartReq := data_manage.AddChartInfoReq{
  1012. ChartClassifyId: classifyId,
  1013. ChartName: chartName,
  1014. ChartType: utils.CHART_TYPE_CURVE,
  1015. Calendar: "公历",
  1016. CorrelationChartInfo: correlationChartInfoReq,
  1017. }
  1018. chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
  1019. chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)
  1020. if err != nil {
  1021. return
  1022. }
  1023. // 添加关系
  1024. multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
  1025. //Id: 0,
  1026. MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
  1027. ChartInfoId: chartInfo.ChartInfoId,
  1028. Source: configSource,
  1029. ModifyTime: time.Now(),
  1030. CreateTime: time.Now(),
  1031. }
  1032. err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
  1033. if err != nil {
  1034. return
  1035. }
  1036. //添加es数据
  1037. go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  1038. return
  1039. }