chart_info.go 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681
  1. package range_analysis
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_mobile/models/data_manage"
  6. "eta/eta_mobile/models/system"
  7. "eta/eta_mobile/services/alarm_msg"
  8. "eta/eta_mobile/services/data"
  9. "eta/eta_mobile/utils"
  10. "fmt"
  11. "github.com/shopspring/decimal"
  12. "math"
  13. "sort"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // GetAutoCalculateDateDataList 获取当前时间相关的区间作为计算依据
  19. func GetAutoCalculateDateDataList(currentDate string, dataList []*data_manage.EdbDataList, req *data_manage.ChartRangeAnalysisExtraConf) (newDataList []*data_manage.EdbDataList, err error) {
  20. currentDateTime, _ := time.ParseInLocation(utils.FormatDate, currentDate, time.Local)
  21. switch req.DateRangeType {
  22. case 0:
  23. // 智能划分得到一个开始日期,和结束日期
  24. var startDateTime time.Time
  25. if req.AutoDateConf.IsAutoStartDate == 0 { //固定设置
  26. startDate := req.AutoDateConf.StartDate
  27. if startDate == "" {
  28. startDate = "2020-01-01"
  29. }
  30. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  31. } else {
  32. startConf := req.AutoDateConf.StartDateConf
  33. startDate := ""
  34. if startConf.BaseDateType == 0 { //
  35. startDate = currentDate
  36. } else if startConf.BaseDateType == 1 {
  37. startDate = time.Now().Format(utils.FormatDate)
  38. }
  39. if startConf.MoveForward > 0 {
  40. startDate = GetEdbDateByMoveForward(startDate, startConf.MoveForward, dataList)
  41. }
  42. if len(startConf.DateChange) > 0 {
  43. startDate, err = HandleEdbDateChange(startDate, startConf.DateChange)
  44. if err != nil {
  45. err = fmt.Errorf("智能划分开始日期处理失败:%s", err.Error())
  46. return
  47. }
  48. }
  49. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  50. }
  51. var calStartTime, calEndTime time.Time
  52. if currentDateTime.Before(startDateTime) {
  53. calStartTime = currentDateTime
  54. calEndTime = startDateTime
  55. } else {
  56. calStartTime = startDateTime
  57. calEndTime = currentDateTime
  58. }
  59. // 根据日期,获取数据
  60. for _, vv := range dataList {
  61. dataTimeT, _ := time.ParseInLocation(utils.FormatDate, vv.DataTime, time.Local)
  62. if dataTimeT.After(calStartTime) && dataTimeT.Before(calEndTime) ||
  63. dataTimeT.Equal(calStartTime) ||
  64. dataTimeT.Equal(calEndTime) {
  65. newDataList = append(newDataList, vv)
  66. }
  67. }
  68. }
  69. return
  70. }
  71. // HandleDataByCalculateType 根据计算公式处理数据
  72. func HandleDataByCalculateType(originList []*data_manage.ChartRangeAnalysisDateDataItem, originDataList []*data_manage.EdbDataList, req *data_manage.ChartRangeAnalysisExtraConf) (newList []*data_manage.EdbDataList, err error) {
  73. if len(originList) == 0 {
  74. return
  75. }
  76. calculateType := req.CalculateType
  77. switch calculateType {
  78. case 0: //均值
  79. var sum float64
  80. if req.DateRangeType == 0 {
  81. for _, item := range originList {
  82. for _, v := range item.DataList {
  83. sum = 0
  84. //计算的数据返回需要重新确定
  85. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  86. if e != nil {
  87. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  88. return
  89. }
  90. for _, vv := range calDataList {
  91. sum += vv.Value
  92. }
  93. val := sum / float64(len(calDataList))
  94. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  95. newList = append(newList, &data_manage.EdbDataList{
  96. DataTime: v.DataTime,
  97. Value: val,
  98. DataTimestamp: v.DataTimestamp,
  99. })
  100. }
  101. }
  102. } else {
  103. for _, item := range originList {
  104. sum = 0
  105. for k, v := range item.DataList {
  106. sum += v.Value
  107. val := sum / float64(k+1)
  108. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  109. newList = append(newList, &data_manage.EdbDataList{
  110. DataTime: v.DataTime,
  111. Value: val,
  112. DataTimestamp: v.DataTimestamp,
  113. })
  114. }
  115. }
  116. }
  117. case 1: //累计值
  118. var sum float64
  119. if req.DateRangeType == 0 {
  120. for _, item := range originList {
  121. sum = 0
  122. for _, v := range item.DataList {
  123. sum = 0
  124. //计算的数据返回需要重新确定
  125. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  126. if e != nil {
  127. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  128. return
  129. }
  130. for _, vv := range calDataList {
  131. sum += vv.Value
  132. }
  133. val := sum
  134. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  135. newList = append(newList, &data_manage.EdbDataList{
  136. DataTime: v.DataTime,
  137. Value: val,
  138. DataTimestamp: v.DataTimestamp,
  139. })
  140. }
  141. }
  142. } else {
  143. for _, item := range originList {
  144. sum = 0
  145. for _, v := range item.DataList {
  146. sum += v.Value
  147. val := sum
  148. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  149. newList = append(newList, &data_manage.EdbDataList{
  150. DataTime: v.DataTime,
  151. Value: val,
  152. DataTimestamp: v.DataTimestamp,
  153. })
  154. }
  155. }
  156. }
  157. case 2: //涨幅
  158. if req.DateRangeType == 0 {
  159. for _, item := range originList {
  160. for _, v := range item.DataList {
  161. var baseVal float64
  162. //计算的数据返回需要重新确定
  163. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  164. if e != nil {
  165. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  166. return
  167. }
  168. if len(calDataList) == 0 {
  169. continue
  170. }
  171. baseVal = calDataList[len(calDataList)-1].Value
  172. if baseVal == 0 {
  173. continue
  174. }
  175. val := (v.Value - baseVal) / baseVal
  176. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  177. newList = append(newList, &data_manage.EdbDataList{
  178. DataTime: v.DataTime,
  179. Value: val,
  180. DataTimestamp: v.DataTimestamp,
  181. })
  182. }
  183. }
  184. } else {
  185. for _, item := range originList {
  186. var baseVal float64
  187. for k, v := range item.DataList {
  188. if k == 0 {
  189. baseVal = v.Value
  190. if baseVal == 0 {
  191. break
  192. }
  193. }
  194. val := (v.Value - baseVal) / baseVal
  195. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  196. newList = append(newList, &data_manage.EdbDataList{
  197. DataTime: v.DataTime,
  198. Value: val,
  199. DataTimestamp: v.DataTimestamp,
  200. })
  201. }
  202. }
  203. }
  204. case 3: //复合增长率
  205. if req.DateRangeType == 0 {
  206. for _, item := range originList {
  207. for _, v := range item.DataList {
  208. var baseVal float64
  209. var baseDate string
  210. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  211. if e != nil {
  212. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  213. return
  214. }
  215. if len(calDataList) == 0 {
  216. continue
  217. }
  218. baseVal = calDataList[len(calDataList)-1].Value
  219. baseDate = calDataList[len(calDataList)-1].DataTime
  220. if v.DataTime == baseDate {
  221. continue
  222. }
  223. if baseVal == 0 {
  224. continue
  225. }
  226. baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
  227. if e != nil {
  228. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  229. return
  230. }
  231. tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  232. if e != nil {
  233. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  234. return
  235. }
  236. // 计算两个日期相差的天数
  237. diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
  238. val := v.Value / baseVal
  239. val = math.Pow(val, 1/diff) - 1
  240. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  241. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  242. }
  243. }
  244. } else {
  245. for _, item := range originList {
  246. var baseVal float64
  247. var baseDate string
  248. for k, v := range item.DataList {
  249. if k == 0 {
  250. baseVal = v.Value
  251. baseDate = v.DataTime
  252. if baseVal == 0 {
  253. break
  254. }
  255. continue
  256. }
  257. baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
  258. if e != nil {
  259. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  260. return
  261. }
  262. tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  263. if e != nil {
  264. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  265. return
  266. }
  267. // 计算两个日期相差的天数
  268. diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
  269. val := v.Value / baseVal
  270. val = math.Pow(val, 1/diff) - 1
  271. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  272. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  273. }
  274. }
  275. }
  276. case 4: //最大值
  277. var maxVal float64
  278. if req.DateRangeType == 0 {
  279. for _, item := range originList {
  280. for _, v := range item.DataList {
  281. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  282. if e != nil {
  283. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  284. return
  285. }
  286. for kk, vv := range calDataList {
  287. if kk == 0 {
  288. maxVal = vv.Value
  289. }
  290. if vv.Value > maxVal {
  291. maxVal = vv.Value
  292. }
  293. }
  294. val := maxVal
  295. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  296. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  297. }
  298. }
  299. } else {
  300. for _, item := range originList {
  301. for k, v := range item.DataList {
  302. if k == 0 {
  303. maxVal = v.Value
  304. }
  305. if v.Value > maxVal {
  306. maxVal = v.Value
  307. }
  308. val := maxVal
  309. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  310. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  311. }
  312. }
  313. }
  314. case 5: //最小值
  315. var minVal float64
  316. if req.DateRangeType == 0 {
  317. for _, item := range originList {
  318. for _, v := range item.DataList {
  319. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  320. if e != nil {
  321. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  322. return
  323. }
  324. for kk, vv := range calDataList {
  325. if kk == 0 {
  326. minVal = vv.Value
  327. }
  328. if vv.Value < minVal {
  329. minVal = vv.Value
  330. }
  331. }
  332. val := minVal
  333. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  334. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  335. }
  336. }
  337. } else {
  338. for _, item := range originList {
  339. for k, v := range item.DataList {
  340. if k == 0 {
  341. minVal = v.Value
  342. }
  343. if v.Value < minVal {
  344. minVal = v.Value
  345. }
  346. val := minVal
  347. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  348. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  349. }
  350. }
  351. }
  352. }
  353. return
  354. }
  355. // GetChartEdbInfoFormat 区间计算图表-获取指标信息
  356. func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingList []*data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
  357. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  358. for _, edbInfoMapping := range edbInfoMappingList {
  359. if edbInfoMapping == nil {
  360. err = fmt.Errorf("指标信息有误")
  361. return
  362. }
  363. edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
  364. if edbInfoMapping.Unit == `无` {
  365. edbInfoMapping.Unit = ``
  366. }
  367. if chartInfoId <= 0 {
  368. edbInfoMapping.IsAxis = 1
  369. edbInfoMapping.LeadValue = 0
  370. edbInfoMapping.LeadUnit = ""
  371. edbInfoMapping.ChartEdbMappingId = 0
  372. edbInfoMapping.ChartInfoId = 0
  373. edbInfoMapping.IsOrder = false
  374. edbInfoMapping.EdbInfoType = 1
  375. edbInfoMapping.ChartStyle = ""
  376. edbInfoMapping.ChartColor = ""
  377. edbInfoMapping.ChartWidth = 0
  378. } else {
  379. edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
  380. }
  381. edbList = append(edbList, edbInfoMapping)
  382. }
  383. return
  384. }
  385. // GetChartDataByEdbInfoList 区间计算图表-根据指标信息获取x轴和y轴
  386. func GetChartDataByEdbInfoList(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
  387. if chartInfoId > 0 && req.EdbInfoMode == 1 {
  388. edbList, xEdbIdValue, dataResp, err = GetChartDataByEdbInfoListBySeries(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, req)
  389. return
  390. }
  391. for _, edbInfoMapping := range edbInfoMappingList {
  392. edbInfoMapping, err = getChartDataByEdbInfo(edbInfoMapping, req)
  393. if err != nil {
  394. return
  395. }
  396. if req.CalculateType == 2 || req.CalculateType == 3 {
  397. edbInfoMapping.Unit = "无"
  398. edbInfoMapping.UnitEn = "无"
  399. }
  400. dataList := edbInfoMapping.DataList.([]*data_manage.EdbDataList)
  401. // 处理上下限
  402. var maxData, minData float64
  403. if len(dataList) > 0 {
  404. maxData = dataList[0].Value
  405. minData = dataList[0].Value
  406. for _, v := range dataList {
  407. if v.Value > maxData {
  408. maxData = v.Value
  409. }
  410. if v.Value < minData {
  411. minData = v.Value
  412. }
  413. }
  414. }
  415. edbInfoMapping.MaxData = maxData
  416. edbInfoMapping.MinData = minData
  417. xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
  418. }
  419. //根据时间类型来筛选最终的数据
  420. yearMax := 0
  421. if dateType == utils.DateTypeNYears {
  422. for _, v := range edbInfoMappingList {
  423. dataList := v.DataList.([]*data_manage.EdbDataList)
  424. if len(dataList) > 0 {
  425. latestDate := dataList[0].DataTime
  426. if latestDate != "" {
  427. lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
  428. if tErr != nil {
  429. err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
  430. return
  431. }
  432. if lastDateT.Year() > yearMax {
  433. yearMax = lastDateT.Year()
  434. }
  435. }
  436. }
  437. }
  438. }
  439. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  440. if startDate != "" {
  441. for k, v := range edbInfoMappingList {
  442. var maxData, minData float64
  443. dataList := v.DataList.([]*data_manage.EdbDataList)
  444. newDataList := make([]*data_manage.EdbDataList, 0)
  445. if len(dataList) == 0 {
  446. newDataList = dataList
  447. } else {
  448. firstFlag := true
  449. for _, d := range dataList {
  450. if endDate != "" && d.DataTime > endDate {
  451. continue
  452. }
  453. if d.DataTime < startDate {
  454. continue
  455. }
  456. newDataList = append(newDataList, d)
  457. if firstFlag {
  458. maxData = d.Value
  459. minData = d.Value
  460. firstFlag = false
  461. } else {
  462. if d.Value > maxData {
  463. maxData = d.Value
  464. }
  465. if d.Value < minData {
  466. minData = d.Value
  467. }
  468. }
  469. }
  470. }
  471. edbInfoMappingList[k].DataList = newDataList
  472. edbInfoMappingList[k].MinData = minData
  473. edbInfoMappingList[k].MaxData = maxData
  474. }
  475. }
  476. dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req}
  477. if req.MultipleGraphConfigId > 0 {
  478. multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
  479. if e != nil && e.Error() != utils.ErrNoRow() {
  480. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  481. return
  482. }
  483. // 查询是否已经生成指标
  484. dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
  485. }
  486. edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
  487. if err != nil {
  488. err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
  489. return
  490. }
  491. return
  492. }
  493. func GetChartDataByEdbInfoListBySeries(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, dataResp data_manage.ChartRangeAnalysisDataResp, err error) {
  494. //查询seriesId
  495. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  496. seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfoId)
  497. if err != nil {
  498. if err.Error() == utils.ErrNoRow() {
  499. err = fmt.Errorf("图表关联关系不存在")
  500. return
  501. } else {
  502. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  503. return
  504. }
  505. }
  506. //根据seriesId查询数据
  507. //并把数据放到dataList中
  508. for _, edbInfoMapping := range edbInfoMappingList {
  509. dataOb := new(data_manage.FactorEdbSeriesCalculateDataQjjs)
  510. dataList, e := dataOb.GetEdbDataList(seriesMappingItem.FactorEdbSeriesId, edbInfoMapping.EdbInfoId, startDate, endDate)
  511. if e != nil {
  512. err = e
  513. return
  514. }
  515. if req.CalculateType == 2 || req.CalculateType == 3 {
  516. edbInfoMapping.Unit = "无"
  517. edbInfoMapping.UnitEn = "无"
  518. }
  519. edbInfoMapping.DataList = dataList
  520. // 处理上下限
  521. var maxData, minData float64
  522. if len(dataList) > 0 {
  523. maxData = dataList[0].Value
  524. minData = dataList[0].Value
  525. for _, v := range dataList {
  526. if v.Value > maxData {
  527. maxData = v.Value
  528. }
  529. if v.Value < minData {
  530. minData = v.Value
  531. }
  532. }
  533. }
  534. edbInfoMapping.MaxData = maxData
  535. edbInfoMapping.MinData = minData
  536. xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
  537. }
  538. yearMax := 0
  539. if dateType == utils.DateTypeNYears {
  540. for _, v := range edbInfoMappingList {
  541. dataList := v.DataList.([]*data_manage.EdbDataList)
  542. latestDate := dataList[0].DataTime
  543. if latestDate != "" {
  544. lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
  545. if tErr != nil {
  546. err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
  547. return
  548. }
  549. if lastDateT.Year() > yearMax {
  550. yearMax = lastDateT.Year()
  551. }
  552. }
  553. }
  554. }
  555. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  556. if startDate != "" {
  557. for k, v := range edbInfoMappingList {
  558. var maxData, minData float64
  559. dataList := v.DataList.([]*data_manage.EdbDataList)
  560. newDataList := make([]*data_manage.EdbDataList, 0)
  561. if len(dataList) == 0 {
  562. newDataList = dataList
  563. } else {
  564. firstFlag := true
  565. for _, d := range dataList {
  566. if endDate != "" && d.DataTime > endDate {
  567. continue
  568. }
  569. if d.DataTime < startDate {
  570. continue
  571. }
  572. newDataList = append(newDataList, d)
  573. if firstFlag {
  574. maxData = d.Value
  575. minData = d.Value
  576. firstFlag = false
  577. } else {
  578. if d.Value > maxData {
  579. maxData = d.Value
  580. }
  581. if d.Value < minData {
  582. minData = d.Value
  583. }
  584. }
  585. }
  586. }
  587. edbInfoMappingList[k].DataList = newDataList
  588. edbInfoMappingList[k].MinData = minData
  589. edbInfoMappingList[k].MaxData = maxData
  590. }
  591. }
  592. dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req, SeriesId: seriesMappingItem.FactorEdbSeriesId}
  593. // 查询配置关联关系
  594. if req.MultipleGraphConfigId > 0 {
  595. multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
  596. if e != nil && e.Error() != utils.ErrNoRow() {
  597. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  598. return
  599. }
  600. // 查询是否已经生成指标
  601. dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
  602. }
  603. edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
  604. if err != nil {
  605. err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
  606. return
  607. }
  608. return
  609. }
  610. // getChartDataByEdbInfo 区间计算图表-根据指标信息获取x轴和y轴
  611. func getChartDataByEdbInfo(edbInfoMapping *data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (newEdbInfoMapping *data_manage.ChartEdbInfoMapping, err error) {
  612. newEdbInfoMapping = edbInfoMapping
  613. // 指标的开始日期和结束日期
  614. edbStartDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.StartDate, time.Local)
  615. //edbStartDate := edbStartDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  616. edbEndDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.EndDate, time.Local)
  617. edbEndDate := edbEndDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  618. // 获取时间基准指标在时间区间内的值
  619. dataListTmp := make([]*data_manage.EdbDataList, 0)
  620. switch edbInfoMapping.EdbInfoCategoryType {
  621. case 0:
  622. dataListTmp, err = data_manage.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.SubSource, edbInfoMapping.EdbInfoId, "", "")
  623. case 1:
  624. _, dataListTmp, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfoMapping.EdbInfoId, "", "", false)
  625. default:
  626. err = errors.New("指标base类型异常")
  627. return
  628. }
  629. var dataList data_manage.SortEdbDataList
  630. dataList = dataListTmp
  631. sort.Sort(dataList)
  632. dateList := make([]*data_manage.ChartRangeAnalysisDateDataItem, 0)
  633. switch req.DateRangeType {
  634. case 0:
  635. // 智能划分得到一个开始日期,和结束日期
  636. var startDateTime, endDateTime time.Time
  637. startDateTime = edbStartDateTime
  638. /*if req.AutoDateConf.IsAutoStartDate == 0 { //固定设置
  639. startDate := req.AutoDateConf.StartDate
  640. if startDate == "" {
  641. startDate = "2020-01-01"
  642. }
  643. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  644. } else {
  645. startConf := req.AutoDateConf.StartDateConf
  646. startDate := ""
  647. if startConf.BaseDateType == 0 { //
  648. startDate = edbEndDate
  649. } else if startConf.BaseDateType == 1 {
  650. startDate = time.Now().Format(utils.FormatDate)
  651. }
  652. if startConf.MoveForward > 0 {
  653. startDate = GetEdbDateByMoveForward(startConf.MoveForward, dataList)
  654. }
  655. if len(startConf.DateChange) > 0 {
  656. startDate, err = HandleEdbDateChange(startDate, startConf.DateChange)
  657. if err != nil {
  658. err = fmt.Errorf("智能划分开始日期处理失败:%s", err.Error())
  659. return
  660. }
  661. }
  662. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  663. }*/
  664. if req.AutoDateConf.IsAutoEndDate == 0 { //固定设置
  665. endDate := req.AutoDateConf.EndDate
  666. if endDate == "" {
  667. err = fmt.Errorf("智能划分截止日期处理失败:请输入截止日期")
  668. return
  669. }
  670. // todo 如果截止日期比指标日期还要大,则用指标的最新日期
  671. endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  672. } else {
  673. endConf := req.AutoDateConf.EndDateConf
  674. endDate := edbEndDate
  675. if endConf.MoveForward > 0 {
  676. endDate = GetEdbDateByMoveForward(endDate, endConf.MoveForward, dataList)
  677. }
  678. if len(endConf.DateChange) > 0 {
  679. endDate, err = HandleEdbDateChange(endDate, endConf.DateChange)
  680. if err != nil {
  681. err = fmt.Errorf("智能划分结束日期处理失败:%s", err.Error())
  682. return
  683. }
  684. }
  685. endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  686. }
  687. dateList = append(dateList, &data_manage.ChartRangeAnalysisDateDataItem{
  688. StartDate: startDateTime,
  689. EndDate: endDateTime})
  690. case 1:
  691. // 手工划分得到多个开始日期和结束日期(已排序)
  692. for _, v := range req.ManualDateConf {
  693. startDateT, _ := time.ParseInLocation(utils.FormatDate, v.StartDate, time.Local)
  694. endDateT, _ := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  695. tmp := &data_manage.ChartRangeAnalysisDateDataItem{
  696. StartDate: startDateT,
  697. EndDate: endDateT,
  698. }
  699. dateList = append(dateList, tmp)
  700. }
  701. case 2:
  702. // 跨年划分得到多个开始日期和结束日期
  703. startYear := edbStartDateTime.Year()
  704. endYear := edbEndDateTime.Year()
  705. startDay := req.YearDateConf.StartDay
  706. endDay := req.YearDateConf.EndDay
  707. for year := startYear; year <= endYear; year++ {
  708. startDate := fmt.Sprintf("%d-%s", year, startDay)
  709. endDate := fmt.Sprintf("%d-%s", year+1, endDay)
  710. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  711. endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  712. if startDateTime.Before(edbStartDateTime) {
  713. break
  714. }
  715. tmp := &data_manage.ChartRangeAnalysisDateDataItem{
  716. StartDate: startDateTime,
  717. EndDate: endDateTime,
  718. }
  719. dateList = append(dateList, tmp)
  720. }
  721. }
  722. // 根据日期,获取数据
  723. for _, v := range dateList {
  724. for _, vv := range dataList {
  725. dataTimeT, _ := time.ParseInLocation(utils.FormatDate, vv.DataTime, time.Local)
  726. if dataTimeT.After(v.StartDate) && dataTimeT.Before(v.EndDate) ||
  727. dataTimeT.Equal(v.StartDate) ||
  728. dataTimeT.Equal(v.EndDate) {
  729. v.DataList = append(v.DataList, vv)
  730. }
  731. }
  732. }
  733. // 根据时间区间类型来获取数据的计算窗口,然后再拼接成整段数据
  734. newDataList, err := HandleDataByCalculateType(dateList, dataList, req)
  735. if err != nil {
  736. return
  737. }
  738. if req.UnNormalDataDealType > 0 {
  739. switch req.UnNormalDataDealType { //0:不处理,1:剔除,2替换
  740. case 1:
  741. dealDataList := make([]*data_manage.EdbDataList, 0)
  742. for _, v := range newDataList {
  743. if !utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
  744. dealDataList = append(dealDataList, v)
  745. }
  746. }
  747. case 2:
  748. for i, v := range newDataList {
  749. if utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
  750. newDataList[i].Value = req.UnNormalDataConf.ReplaceValue
  751. }
  752. }
  753. }
  754. }
  755. if req.DataConvertType > 0 {
  756. // 数据转换类型 0不转, 1乘 2除 3对数
  757. switch req.DataConvertType {
  758. case 1:
  759. for i, v := range newDataList {
  760. val := v.Value * req.DataConvertConf.Value
  761. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  762. newDataList[i].Value = val
  763. }
  764. //item.MaxData = item.MaxData * v.ConvertValue
  765. //item.MinData = item.MinData * v.ConvertValue
  766. case 2:
  767. for i, v := range newDataList {
  768. val := v.Value / req.DataConvertConf.Value
  769. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  770. newDataList[i].Value = val
  771. }
  772. //item.MaxData = item.MaxData / v.ConvertValue
  773. //item.MinData = item.MinData / v.ConvertValue
  774. case 3:
  775. for i, v := range newDataList {
  776. if v.Value <= 0 {
  777. err = errors.New("数据中含有负数或0,无法对数运算")
  778. return
  779. }
  780. val := math.Log(v.Value) / math.Log(req.DataConvertConf.Value)
  781. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  782. newDataList[i].Value = val
  783. }
  784. //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
  785. //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
  786. }
  787. }
  788. newEdbInfoMapping.DataList = newDataList
  789. //时间处理
  790. return
  791. }
  792. // RollingCorrelationChartDataResp 滚动区间计算图表数据
  793. type RollingCorrelationChartDataResp struct {
  794. MaxData float64
  795. MinData float64
  796. LatestDate string `description:"真实数据的最后日期"`
  797. EdbInfoCategoryType int
  798. ChartColor string
  799. ChartStyle string
  800. PredictChartColor string
  801. ChartType int
  802. ChartWidth int
  803. EdbName string
  804. EdbNameEn string
  805. Unit string
  806. UnitEn string
  807. IsAxis int
  808. DataList []data_manage.EdbDataList
  809. }
  810. // ChartInfoRefresh 图表刷新
  811. func ChartInfoRefresh(chartInfoId int, uniqueCode string) (isAsync bool, err error) {
  812. var errMsg string
  813. defer func() {
  814. if err != nil {
  815. tips := fmt.Sprintf("CorrelationChartInfoRefresh: %s", errMsg)
  816. utils.FileLog.Info(tips)
  817. go alarm_msg.SendAlarmMsg(tips, 3)
  818. }
  819. }()
  820. var chartInfo *data_manage.ChartInfo
  821. if chartInfoId > 0 {
  822. chartInfo, err = data_manage.GetChartInfoById(chartInfoId)
  823. if err != nil {
  824. if err.Error() == utils.ErrNoRow() {
  825. errMsg = "图表已被删除,请刷新页面"
  826. err = errors.New(errMsg)
  827. return
  828. }
  829. errMsg = "获取图表信息失败"
  830. err = errors.New("获取图表信息失败,Err:" + err.Error())
  831. return
  832. }
  833. } else {
  834. chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode)
  835. if err != nil {
  836. if err.Error() == utils.ErrNoRow() {
  837. errMsg = "图表已被删除,请刷新页面"
  838. err = errors.New(errMsg)
  839. return
  840. }
  841. errMsg = "获取图表信息失败"
  842. err = errors.New("获取图表信息失败,Err:" + err.Error())
  843. return
  844. }
  845. }
  846. // 1.刷新图表关联的指标
  847. mappings, e := data_manage.GetChartEdbMappingList(chartInfoId)
  848. if e != nil {
  849. utils.FileLog.Info(fmt.Sprintf("获取图表关联指标失败, err: %v", e))
  850. return
  851. }
  852. if len(mappings) == 0 {
  853. utils.FileLog.Info("图表无关联指标")
  854. return
  855. }
  856. var edbIds []int
  857. for _, v := range mappings {
  858. edbIds = append(edbIds, v.EdbInfoId)
  859. }
  860. if e, _ = data.EdbInfoRefreshAllFromBaseV3(edbIds, false, true, false); e != nil {
  861. utils.FileLog.Info(fmt.Sprintf("批量刷新指标失败, err: %v", e))
  862. return
  863. }
  864. // todo 重新计算
  865. // 区间计算图表配置校验
  866. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  867. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
  868. if err != nil {
  869. errMsg = "配置信息错误"
  870. err = errors.New(errMsg + ", Err: " + err.Error())
  871. return
  872. }
  873. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  874. seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfo.ChartInfoId)
  875. if err != nil {
  876. if err.Error() == utils.ErrNoRow() {
  877. err = nil
  878. } else {
  879. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  880. return
  881. }
  882. } else {
  883. _, e = FactorEdbStepCalculateRange(seriesMappingItem.FactorEdbSeriesId, edbIds, extraConfig, true)
  884. if e != nil {
  885. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  886. return
  887. }
  888. }
  889. // 4.清除图表缓存
  890. key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
  891. _ = utils.Rc.Delete(key)
  892. return
  893. }
  894. // CopyChartInfo 复制图表
  895. func CopyChartInfo(classifyId int, chartName string, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  896. isSendEmail = true
  897. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  898. chartInfo = &data_manage.ChartInfo{
  899. ChartInfoId: 0,
  900. ChartName: chartName,
  901. ChartClassifyId: classifyId,
  902. SysUserId: sysUser.AdminId,
  903. SysUserRealName: sysUser.RealName,
  904. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  905. CreateTime: time.Now(),
  906. ModifyTime: time.Now(),
  907. DateType: oldChartInfo.DateType,
  908. StartDate: oldChartInfo.StartDate,
  909. EndDate: oldChartInfo.EndDate,
  910. IsSetName: oldChartInfo.IsSetName,
  911. EdbInfoIds: oldChartInfo.EdbInfoIds,
  912. ChartType: oldChartInfo.ChartType,
  913. Calendar: oldChartInfo.Calendar,
  914. SeasonStartDate: oldChartInfo.SeasonStartDate,
  915. SeasonEndDate: oldChartInfo.SeasonEndDate,
  916. ChartImage: oldChartInfo.ChartImage,
  917. BarConfig: oldChartInfo.BarConfig,
  918. //Sort: sort,
  919. LeftMin: oldChartInfo.LeftMin,
  920. LeftMax: oldChartInfo.LeftMax,
  921. RightMin: oldChartInfo.RightMin,
  922. RightMax: oldChartInfo.RightMax,
  923. Right2Min: oldChartInfo.Right2Min,
  924. Right2Max: oldChartInfo.Right2Max,
  925. Disabled: oldChartInfo.Disabled,
  926. Source: oldChartInfo.Source,
  927. ExtraConfig: oldChartInfo.ExtraConfig,
  928. SeasonExtraConfig: oldChartInfo.SeasonExtraConfig,
  929. StartYear: oldChartInfo.StartYear,
  930. Unit: oldChartInfo.Unit,
  931. UnitEn: oldChartInfo.UnitEn,
  932. ChartThemeId: oldChartInfo.ChartThemeId,
  933. SourcesFrom: oldChartInfo.SourcesFrom,
  934. Instructions: oldChartInfo.Instructions,
  935. MarkersLines: oldChartInfo.MarkersLines,
  936. MarkersAreas: oldChartInfo.MarkersAreas,
  937. }
  938. newId, err := data_manage.AddChartInfo(chartInfo)
  939. if err != nil {
  940. err = fmt.Errorf("保存失败,Err:%s", err.Error())
  941. return
  942. }
  943. chartInfo.ChartInfoId = int(newId)
  944. edbInfoMappingList, err := data_manage.GetChartEdbMappingList(oldChartInfo.ChartInfoId)
  945. if err != nil {
  946. err = fmt.Errorf("获取图表,指标信息失败,Err:" + err.Error())
  947. return
  948. }
  949. // 添加图表与指标的关联关系
  950. edbInfoIdArr := make([]int, 0)
  951. {
  952. mapList := make([]*data_manage.ChartEdbMapping, 0)
  953. for _, v := range edbInfoMappingList {
  954. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  955. timestamp = strconv.FormatInt(time.Now().UnixNano(), 10)
  956. mapItem := &data_manage.ChartEdbMapping{
  957. //ChartEdbMappingId: 0,
  958. ChartInfoId: chartInfo.ChartInfoId,
  959. EdbInfoId: v.EdbInfoId,
  960. CreateTime: time.Now(),
  961. ModifyTime: time.Now(),
  962. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  963. MaxData: v.MaxData,
  964. MinData: v.MinData,
  965. IsOrder: v.IsOrder,
  966. IsAxis: v.IsAxis,
  967. EdbInfoType: v.EdbInfoType,
  968. LeadValue: v.LeadValue,
  969. LeadUnit: v.LeadUnit,
  970. ChartStyle: v.ChartStyle,
  971. ChartColor: v.ChartColor,
  972. ChartWidth: v.ChartWidth,
  973. Source: v.Source,
  974. EdbAliasName: v.EdbAliasName,
  975. IsConvert: v.IsConvert,
  976. ConvertType: v.ConvertType,
  977. ConvertValue: v.ConvertValue,
  978. ConvertUnit: v.ConvertEnUnit,
  979. ConvertEnUnit: v.ConvertEnUnit,
  980. }
  981. mapList = append(mapList, mapItem)
  982. }
  983. err = data_manage.AddChartEdbMapping(mapList)
  984. if err != nil {
  985. err = fmt.Errorf("保存失败,Err:%s", err.Error())
  986. return
  987. }
  988. }
  989. // 添加系列和图表映射
  990. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  991. _, err = chartSeriesOb.GetItemByChartInfoId(oldChartInfo.ChartInfoId)
  992. if err != nil {
  993. if err.Error() == utils.ErrNoRow() {
  994. err = nil
  995. } else {
  996. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  997. return
  998. }
  999. } else {
  1000. // 新增指标系列
  1001. // 区间计算图表配置校验
  1002. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  1003. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
  1004. if err != nil {
  1005. errMsg = "配置信息错误"
  1006. err = errors.New(errMsg + ", Err: " + err.Error())
  1007. return
  1008. }
  1009. err = AddSeries(edbInfoIdArr, chartInfo.ChartInfoId, utils.CHART_SOURCE_RANGE_ANALYSIS, extraConfig, chartInfo.ExtraConfig)
  1010. if err != nil {
  1011. errMsg = "操作失败"
  1012. err = errors.New("新增区间计算图表失败, Err: " + err.Error())
  1013. return
  1014. }
  1015. }
  1016. //添加es数据
  1017. go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  1018. return
  1019. }
  1020. /*
  1021. // CalculateCorrelation 计算区间计算-获取x轴和y轴
  1022. func CalculateCorrelation(leadValue int, leadUnit, frequencyA, frequencyB string, dataListA, dataListB []*data_manage.EdbDataList) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
  1023. xData := make([]int, 0)
  1024. yData := make([]float64, 0)
  1025. if leadValue == 0 {
  1026. xData = append(xData, 0)
  1027. }
  1028. if leadValue > 0 {
  1029. leadMin := 0 - leadValue
  1030. xLen := 2*leadValue + 1
  1031. for i := 0; i < xLen; i++ {
  1032. n := leadMin + i
  1033. xData = append(xData, n)
  1034. }
  1035. }
  1036. // 计算窗口,不包含第一天
  1037. //startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  1038. //startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  1039. //// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
  1040. //baseEdbInfo := edbInfoMappingB
  1041. //changeEdbInfo := edbInfoMappingA
  1042. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  1043. //baseEdbInfo := edbInfoMappingA
  1044. //changeEdbInfo := edbInfoMappingB
  1045. // 获取时间基准指标在时间区间内的值
  1046. //aDataList := make([]*data_manage.EdbDataList, 0)
  1047. //switch baseEdbInfo.EdbInfoCategoryType {
  1048. //case 0:
  1049. // aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, startDate, endDate)
  1050. //case 1:
  1051. // _, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
  1052. //default:
  1053. // err = errors.New("指标base类型异常")
  1054. // return
  1055. //}
  1056. //
  1057. //// 获取变频指标所有日期的值, 插值法完善数据
  1058. //bDataList := make([]*data_manage.EdbDataList, 0)
  1059. //switch changeEdbInfo.EdbInfoCategoryType {
  1060. //case 0:
  1061. // bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.SubSource, changeEdbInfo.EdbInfoId, "", "")
  1062. //case 1:
  1063. // _, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  1064. //default:
  1065. // err = errors.New("指标change类型异常")
  1066. // return
  1067. //}
  1068. //changeDataMap := make(map[string]float64)
  1069. //newChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  1070. //if e != nil {
  1071. // err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1072. // return
  1073. //}
  1074. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  1075. baseDataList := make([]*data_manage.EdbDataList, 0)
  1076. baseDataMap := make(map[string]float64)
  1077. changeDataList := make([]*data_manage.EdbDataList, 0)
  1078. changeDataMap := make(map[string]float64)
  1079. // 先把低频指标升频为高频
  1080. {
  1081. frequencyIntMap := map[string]int{
  1082. "日度": 1,
  1083. "周度": 2,
  1084. "旬度": 3,
  1085. "月度": 4,
  1086. "季度": 5,
  1087. "年度": 6,
  1088. }
  1089. // 如果A指标是高频,那么就需要对B指标进行升频
  1090. if frequencyIntMap[frequencyA] < frequencyIntMap[frequencyB] {
  1091. tmpNewChangeDataList, e := HandleDataByLinearRegression(dataListB, changeDataMap)
  1092. if e != nil {
  1093. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1094. return
  1095. }
  1096. changeDataList = tmpNewChangeDataList
  1097. baseDataList = dataListA
  1098. for _, v := range baseDataList {
  1099. baseDataMap[v.DataTime] = v.Value
  1100. }
  1101. } else if frequencyIntMap[frequencyA] > frequencyIntMap[frequencyB] {
  1102. // 如果B指标是高频,那么就需要对A指标进行升频
  1103. tmpNewChangeDataList, e := HandleDataByLinearRegression(dataListA, baseDataMap)
  1104. if e != nil {
  1105. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1106. return
  1107. }
  1108. baseDataList = tmpNewChangeDataList
  1109. changeDataList = dataListB
  1110. for _, v := range changeDataList {
  1111. changeDataMap[v.DataTime] = v.Value
  1112. }
  1113. } else {
  1114. baseDataList = dataListA
  1115. for _, v := range baseDataList {
  1116. baseDataMap[v.DataTime] = v.Value
  1117. }
  1118. changeDataList = dataListB
  1119. for _, v := range changeDataList {
  1120. changeDataMap[v.DataTime] = v.Value
  1121. }
  1122. }
  1123. }
  1124. // 计算不领先也不滞后时的相关系数
  1125. baseCalculateData := make([]float64, 0)
  1126. baseDataTimeArr := make([]string, 0)
  1127. for i := range baseDataList {
  1128. baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
  1129. baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
  1130. }
  1131. //zeroBaseData := make([]float64, 0)
  1132. //zeroCalculateData := make([]float64, 0)
  1133. //for i := range baseDataTimeArr {
  1134. // tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
  1135. // tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
  1136. // if ok1 && ok2 {
  1137. // zeroBaseData = append(zeroBaseData, tmpBaseVal)
  1138. // zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
  1139. // }
  1140. //}
  1141. //if len(zeroBaseData) != len(zeroCalculateData) {
  1142. // err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
  1143. // return
  1144. //}
  1145. //zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
  1146. //if leadValue == 0 {
  1147. // yData = append(yData, zeroRatio)
  1148. //}
  1149. // 计算领先/滞后N期
  1150. if leadValue > 0 {
  1151. // 平移变频指标领先/滞后的日期(单位天)
  1152. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  1153. for i := range xData {
  1154. //if xData[i] == 0 {
  1155. // yData = append(yData, zeroRatio)
  1156. // continue
  1157. //}
  1158. xCalculateData := make([]float64, 0)
  1159. yCalculateData := make([]float64, 0)
  1160. // 平移指定天数
  1161. mDays := int(moveUnitDays) * xData[i]
  1162. _, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
  1163. // 取出对应的基准日期的值
  1164. for i2 := range baseDataTimeArr {
  1165. tmpDate := baseDataTimeArr[i2]
  1166. if yVal, ok := dMap[tmpDate]; ok {
  1167. xCalculateData = append(xCalculateData, baseCalculateData[i2])
  1168. yCalculateData = append(yCalculateData, yVal)
  1169. }
  1170. }
  1171. if len(yCalculateData) <= 0 {
  1172. //err = fmt.Errorf("领先滞后相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(yCalculateData))
  1173. //return
  1174. // 领先滞后后,没有可以计算的数据了
  1175. continue
  1176. }
  1177. // 公式计算出领先/滞后频度对应点的区间计算系数
  1178. ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
  1179. yData = append(yData, ratio)
  1180. }
  1181. }
  1182. xEdbIdValue = xData
  1183. yDataList = make([]data_manage.YData, 0)
  1184. yDate := "0000-00-00"
  1185. yDataList = append(yDataList, data_manage.YData{
  1186. Date: yDate,
  1187. Value: yData,
  1188. })
  1189. return
  1190. }
  1191. // GetFactorChartDataByChartId 获取多因子区间计算图表数据
  1192. func GetFactorChartDataByChartId(chartInfoId int, extraConfig string) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
  1193. if chartInfoId <= 0 {
  1194. return
  1195. }
  1196. // 指标对应的图例
  1197. extra := new(data_manage.CorrelationChartInfoExtraConfig)
  1198. if extraConfig != "" {
  1199. if e := json.Unmarshal([]byte(extraConfig), extra); e != nil {
  1200. err = fmt.Errorf("解析图表额外配置失败, err: %v", e)
  1201. return
  1202. }
  1203. }
  1204. legends := make(map[string]*data_manage.CorrelationChartLegend)
  1205. if extra != nil {
  1206. for _, v := range extra.LegendConfig {
  1207. s := fmt.Sprintf("%d-%d", v.SeriesId, v.EdbInfoId)
  1208. legends[s] = v
  1209. }
  1210. }
  1211. // 获取图表引用到的系列指标
  1212. chartMappingOb := new(data_manage.FactorEdbSeriesChartMapping)
  1213. cond := fmt.Sprintf(" AND %s = ? AND %s = 1", chartMappingOb.Cols().ChartInfoId, chartMappingOb.Cols().EdbUsed)
  1214. pars := make([]interface{}, 0)
  1215. pars = append(pars, chartInfoId)
  1216. chartMappings, e := chartMappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  1217. if e != nil {
  1218. err = fmt.Errorf("获取图表引用系列指标失败")
  1219. return
  1220. }
  1221. // 取出计算结果
  1222. yDataList = make([]data_manage.YData, 0)
  1223. yDate := "0000-00-00"
  1224. for k, m := range chartMappings {
  1225. var values []data_manage.FactorEdbSeriesCorrelationMatrixValues
  1226. if m.CalculateData != "" {
  1227. e = json.Unmarshal([]byte(m.CalculateData), &values)
  1228. if e != nil {
  1229. err = fmt.Errorf("系列指标计算数据有误, err: %v", e)
  1230. return
  1231. }
  1232. }
  1233. var y []float64
  1234. for _, v := range values {
  1235. if k == 0 {
  1236. xEdbIdValue = append(xEdbIdValue, v.XData)
  1237. }
  1238. y = append(y, v.YData)
  1239. }
  1240. var yData data_manage.YData
  1241. yData.Date = yDate
  1242. yData.Value = y
  1243. yData.SeriesEdb.SeriesId = m.FactorEdbSeriesId
  1244. yData.SeriesEdb.EdbInfoId = m.EdbInfoId
  1245. // 图例
  1246. s := fmt.Sprintf("%d-%d", m.FactorEdbSeriesId, m.EdbInfoId)
  1247. legend := legends[s]
  1248. if legend != nil {
  1249. yData.Name = legend.LegendName
  1250. yData.Color = legend.Color
  1251. }
  1252. yDataList = append(yDataList, yData)
  1253. }
  1254. return
  1255. }
  1256. // FormatChartEdbInfoMappings 补充指标信息
  1257. func FormatChartEdbInfoMappings(chartInfoId int, mappings []*data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
  1258. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  1259. if len(mappings) == 0 {
  1260. return
  1261. }
  1262. for _, v := range mappings {
  1263. if chartInfoId <= 0 {
  1264. v.IsAxis = 1
  1265. v.LeadValue = 0
  1266. v.LeadUnit = ""
  1267. v.ChartEdbMappingId = 0
  1268. v.ChartInfoId = 0
  1269. v.IsOrder = false
  1270. v.EdbInfoType = 1
  1271. v.ChartStyle = ""
  1272. v.ChartColor = ""
  1273. v.ChartWidth = 0
  1274. } else {
  1275. v.LeadUnitEn = data.GetLeadUnitEn(v.LeadUnit)
  1276. v.LeadUnitEn = data.GetLeadUnitEn(v.LeadUnit)
  1277. }
  1278. v.FrequencyEn = data.GetFrequencyEn(v.Frequency)
  1279. if v.Unit == `无` {
  1280. v.Unit = ``
  1281. }
  1282. edbList = append(edbList, v)
  1283. }
  1284. return
  1285. }*/
  1286. func GetEdbDateByMoveForward(startDate string, moveForward int, edbDataList []*data_manage.EdbDataList) (date string) {
  1287. // 根据日期进行排序
  1288. index := 0
  1289. for _, v := range edbDataList {
  1290. if v.DataTime == startDate {
  1291. index += 1
  1292. }
  1293. if index > 0 {
  1294. index += 1
  1295. }
  1296. if index == moveForward {
  1297. date = v.DataTime
  1298. break
  1299. }
  1300. }
  1301. return
  1302. }
  1303. // HandleEdbDateChange 处理日期变换
  1304. func HandleEdbDateChange(date string, dateChange []*data_manage.EdbDateConfDateChange) (newDate string, err error) {
  1305. newDate = date
  1306. if newDate != "" {
  1307. if len(dateChange) > 0 {
  1308. var dateTime time.Time
  1309. dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
  1310. if err != nil {
  1311. err = fmt.Errorf("日期解析失败: %s", err.Error())
  1312. return
  1313. }
  1314. for _, v := range dateChange {
  1315. if v.ChangeType == 1 {
  1316. dateTime = dateTime.AddDate(v.Year, v.Month, v.Day)
  1317. newDate = dateTime.Format(utils.FormatDate)
  1318. } else if v.ChangeType == 2 {
  1319. newDate, err, _ = utils.HandleSystemAppointDateT(dateTime, v.FrequencyDay, v.Frequency)
  1320. if err != nil {
  1321. return
  1322. }
  1323. dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
  1324. if err != nil {
  1325. err = fmt.Errorf("日期解析失败: %s", err.Error())
  1326. return
  1327. }
  1328. }
  1329. }
  1330. }
  1331. }
  1332. return
  1333. }
  1334. // 添加指标系列和数据
  1335. func AddSeries(edbInfoIds []int, chartInfoId, chartInfoSource int, extraConf data_manage.ChartRangeAnalysisExtraConf, calculatesJson string) (err error) {
  1336. edbArr, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  1337. if e != nil {
  1338. err = fmt.Errorf("获取指标列表失败, Err: " + e.Error())
  1339. return
  1340. }
  1341. if len(edbArr) == 0 {
  1342. err = fmt.Errorf("获取指标列表失败, 指标不存在")
  1343. return
  1344. }
  1345. edbInfoType := edbArr[0].EdbInfoType
  1346. // 新增指标系列
  1347. seriesItem := new(data_manage.FactorEdbSeries)
  1348. seriesItem.SeriesName = extraConf.SeriesName
  1349. seriesItem.EdbInfoType = edbInfoType
  1350. seriesItem.CreateTime = time.Now().Local()
  1351. seriesItem.ModifyTime = time.Now().Local()
  1352. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  1353. seriesItem.CalculateStep = calculatesJson
  1354. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  1355. for _, v := range edbArr {
  1356. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  1357. EdbInfoId: v.EdbInfoId,
  1358. EdbCode: v.EdbCode,
  1359. CreateTime: time.Now().Local(),
  1360. ModifyTime: time.Now().Local(),
  1361. })
  1362. }
  1363. seriesId, e := seriesItem.CreateSeriesAndMapping(seriesItem, mappings)
  1364. if e != nil {
  1365. err = fmt.Errorf("新增因子指标系列失败, Err: " + e.Error())
  1366. return
  1367. }
  1368. // 图表关联-此处添加的chart_info_id=0
  1369. seriesChartMapping := new(data_manage.FactorEdbSeriesChartMapping)
  1370. seriesChartMapping.CalculateType = data_manage.FactorEdbSeriesChartCalculateTypeRange
  1371. //新增图表和指标的映射关系
  1372. seriesChartMapping.CalculateData = ""
  1373. seriesChartMapping.FactorEdbSeriesId = seriesId
  1374. seriesChartMapping.ChartInfoId = chartInfoId
  1375. seriesChartMapping.Source = chartInfoSource
  1376. seriesChartMapping.CreateTime = time.Now().Local()
  1377. seriesChartMapping.ModifyTime = time.Now().Local()
  1378. if e = seriesChartMapping.Create(); e != nil {
  1379. err = fmt.Errorf("新增图表关联失败, Err: " + e.Error())
  1380. return
  1381. }
  1382. // todo 计算指标数据并存储
  1383. _, e = FactorEdbStepCalculateRange(seriesId, edbInfoIds, extraConf, false)
  1384. if e != nil {
  1385. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  1386. return
  1387. }
  1388. // 更新系列计算状态
  1389. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  1390. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  1391. seriesItem.ModifyTime = time.Now().Local()
  1392. if e = seriesItem.Update(cols); e != nil {
  1393. err = fmt.Errorf("更新因子指标系列计算状态失败, Err: " + e.Error())
  1394. return
  1395. }
  1396. return
  1397. }
  1398. func EditSeries(seriesMapping *data_manage.FactorEdbSeriesChartMapping, edbInfoIds []int, extraConf data_manage.ChartRangeAnalysisExtraConf, calculatesJson string, recalculate bool) (err error) {
  1399. seriesOb := new(data_manage.FactorEdbSeries)
  1400. seriesItem, e := seriesOb.GetItemById(seriesMapping.FactorEdbSeriesId)
  1401. if e != nil {
  1402. if e.Error() == utils.ErrNoRow() {
  1403. err = fmt.Errorf("因子指标系列不存在, Err: " + e.Error())
  1404. return
  1405. }
  1406. err = fmt.Errorf("获取因子指标系列失败, Err: " + e.Error())
  1407. return
  1408. }
  1409. edbArr, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  1410. if e != nil {
  1411. err = fmt.Errorf("获取指标列表失败, Err: " + e.Error())
  1412. return
  1413. }
  1414. if len(edbArr) == 0 {
  1415. err = fmt.Errorf("指标列表为空")
  1416. return
  1417. }
  1418. var calculateResp data_manage.FactorEdbSeriesStepCalculateResp
  1419. calculateResp.SeriesId = seriesItem.FactorEdbSeriesId
  1420. // 如果不需要进行重新计算(比如只改了系列名称)那么只更新指标系列
  1421. seriesItem.SeriesName = extraConf.SeriesName
  1422. seriesItem.EdbInfoType = edbArr[0].EdbInfoType
  1423. seriesItem.ModifyTime = time.Now().Local()
  1424. updateCols := []string{seriesOb.Cols().SeriesName, seriesOb.Cols().EdbInfoType, seriesOb.Cols().ModifyTime}
  1425. if !recalculate {
  1426. if e = seriesItem.Update(updateCols); e != nil {
  1427. err = fmt.Errorf("更新因子指标系列失败, Err: " + e.Error())
  1428. return
  1429. }
  1430. return
  1431. }
  1432. // 更新系列信息和指标关联
  1433. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  1434. seriesItem.CalculateStep = calculatesJson
  1435. updateCols = append(updateCols, seriesOb.Cols().CalculateState, seriesOb.Cols().CalculateStep)
  1436. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  1437. for _, v := range edbArr {
  1438. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  1439. EdbInfoId: v.EdbInfoId,
  1440. EdbCode: v.EdbCode,
  1441. CreateTime: time.Now().Local(),
  1442. ModifyTime: time.Now().Local(),
  1443. })
  1444. }
  1445. if e = seriesItem.EditSeriesAndMapping(seriesItem, mappings, updateCols); e != nil {
  1446. err = fmt.Errorf("更新因子指标系列信息失败, Err: %s", e.Error())
  1447. return
  1448. }
  1449. // todo 重新计算
  1450. _, e = FactorEdbStepCalculateRange(seriesItem.FactorEdbSeriesId, edbInfoIds, extraConf, false)
  1451. if e != nil {
  1452. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  1453. return
  1454. }
  1455. // 更新系列计算状态
  1456. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  1457. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  1458. seriesItem.ModifyTime = time.Now().Local()
  1459. if e = seriesItem.Update(cols); e != nil {
  1460. err = fmt.Errorf("更新因子指标系列计算状态失败, Err: %s", e.Error())
  1461. return
  1462. }
  1463. return
  1464. }
  1465. // FactorEdbStepCalculateRange 因子指标-区间计算
  1466. func FactorEdbStepCalculateRange(seriesId int, edbArr []int, extraConf data_manage.ChartRangeAnalysisExtraConf, recalculate bool) (calculateResp data_manage.FactorEdbSeriesStepCalculateResp, err error) {
  1467. // todo 如果指标已保存,则用指标数据还是图表指标数据?
  1468. // 获取图表x轴y轴
  1469. defer func() {
  1470. if err != nil {
  1471. tips := fmt.Sprintf("StepCalculate计算失败, ErrMsg: %v", err)
  1472. fmt.Println(tips)
  1473. utils.FileLog.Info(tips)
  1474. go alarm_msg.SendAlarmMsg(tips, 3)
  1475. }
  1476. /*if len(calculateResp.Fail) > 0 {
  1477. tips := "StepCalculate计算失败, ErrMsg: "
  1478. for _, f := range calculateResp.Fail {
  1479. tips += fmt.Sprintf("code: %s, err: %s\n", f.EdbCode, f.ErrMsg)
  1480. }
  1481. fmt.Println(tips)
  1482. utils.FileLog.Info(tips)
  1483. go alarm_msg.SendAlarmMsg(tips, 2)
  1484. }*/
  1485. }()
  1486. edbInfoMappingList, e := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbArr)
  1487. if e != nil {
  1488. err = fmt.Errorf("获取区间计算图表, A指标mapping信息失败, Err:%v", e)
  1489. return
  1490. }
  1491. _, _, _, err = GetChartDataByEdbInfoList(0, 0, 0, "", "", edbInfoMappingList, &extraConf)
  1492. if err != nil {
  1493. err = fmt.Errorf("获取图表数据失败, ErrMsg: %v", err)
  1494. return
  1495. }
  1496. // 重新计算-先清除原数据
  1497. calculateDataOb := new(data_manage.FactorEdbSeriesCalculateDataQjjs)
  1498. cond := fmt.Sprintf("%s = ?", calculateDataOb.Cols().FactorEdbSeriesId)
  1499. pars := make([]interface{}, 0)
  1500. pars = append(pars, seriesId)
  1501. if e := calculateDataOb.RemoveByCondition(cond, pars); e != nil {
  1502. err = fmt.Errorf("清除原数据失败, err: %v", e)
  1503. return
  1504. }
  1505. // 计算成功的保存结果
  1506. dataArr := make([]*data_manage.FactorEdbSeriesCalculateDataQjjs, 0)
  1507. for _, v := range edbInfoMappingList {
  1508. dataList := v.DataList.([]*data_manage.EdbDataList)
  1509. for _, dataItem := range dataList {
  1510. dataTime, _ := time.ParseInLocation(utils.FormatDate, dataItem.DataTime, time.Local)
  1511. dataArr = append(dataArr, &data_manage.FactorEdbSeriesCalculateDataQjjs{
  1512. FactorEdbSeriesId: seriesId,
  1513. EdbInfoId: v.EdbInfoId,
  1514. EdbCode: v.EdbCode,
  1515. DataTime: dataTime,
  1516. Value: dataItem.Value,
  1517. CreateTime: time.Now().Local(),
  1518. ModifyTime: time.Now().Local(),
  1519. DataTimestamp: dataItem.DataTimestamp,
  1520. })
  1521. }
  1522. }
  1523. if len(dataArr) == 0 {
  1524. err = fmt.Errorf("计算结果无数据, seriesId: %d", seriesId)
  1525. return
  1526. }
  1527. if e = calculateDataOb.CreateMulti(dataArr); e != nil {
  1528. err = fmt.Errorf("保存计算结果失败, seriesId: %d, err: %v, ", seriesId, e)
  1529. return
  1530. }
  1531. return
  1532. }
  1533. func CheckChartRangeExtraConfig(extraConfig data_manage.ChartRangeAnalysisExtraConf) (err error, errMsg string, isSendEmail bool) {
  1534. extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
  1535. if extraConfig.SeriesName == "" && extraConfig.EdbInfoMode == 1 {
  1536. errMsg = "请输入指标系列名称"
  1537. err = errors.New(errMsg)
  1538. isSendEmail = false
  1539. return
  1540. }
  1541. if extraConfig.CalculateType > 5 || extraConfig.CalculateType < 0 {
  1542. errMsg = "计算方式参数错误"
  1543. err = errors.New(errMsg)
  1544. isSendEmail = false
  1545. return
  1546. }
  1547. switch extraConfig.DateRangeType {
  1548. case 0:
  1549. case 1:
  1550. if len(extraConfig.ManualDateConf) == 0 {
  1551. errMsg = "请选择时间区间"
  1552. err = errors.New(errMsg)
  1553. return
  1554. }
  1555. // 先按开始时间排序
  1556. sort.Sort(data_manage.ChartRangeAnalysisManualDateConfList(extraConfig.ManualDateConf))
  1557. // 校验日期
  1558. // 1.如果截止时间小于指标的截止日期,需要重置为指标的截止日期
  1559. // 2.时间区间不能重叠
  1560. for i := 1; i < len(extraConfig.ManualDateConf); i++ {
  1561. start1, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i-1].EndDate)
  1562. if e != nil {
  1563. err = e
  1564. errMsg = "截止日期格式有误"
  1565. return
  1566. }
  1567. start2, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].EndDate)
  1568. if e != nil {
  1569. err = e
  1570. errMsg = "截止日期格式有误"
  1571. return
  1572. }
  1573. start3, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].StartDate)
  1574. if e != nil {
  1575. err = e
  1576. errMsg = "截止日期格式有误"
  1577. return
  1578. }
  1579. // 如果当前区间的开始时间小于等于前一个区间的结束时间,则存在重叠
  1580. if !start2.After(start1) || start3.Before(start1) {
  1581. errMsg = "日期区间存在重叠"
  1582. return
  1583. }
  1584. }
  1585. //如果截止时间大于指标的截止日期,需要重置为指标的截止日期
  1586. case 2:
  1587. if extraConfig.YearDateConf.StartDay == "" || extraConfig.YearDateConf.EndDay == "" {
  1588. errMsg = "请选择时间区间"
  1589. return
  1590. }
  1591. if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.StartDay); e != nil {
  1592. errMsg = "开始日期格式有误"
  1593. return
  1594. }
  1595. if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.EndDay); e != nil {
  1596. errMsg = "结束日期格式有误"
  1597. return
  1598. }
  1599. }
  1600. return
  1601. }