chart_info.go 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197
  1. package range_analysis
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/system"
  7. "eta/eta_api/services/alarm_msg"
  8. "eta/eta_api/services/data"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "github.com/shopspring/decimal"
  12. "math"
  13. "sort"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // 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 && req.AutoDateConf.IsAutoStartDate > 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 && req.AutoDateConf.IsAutoStartDate > 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 && req.AutoDateConf.IsAutoStartDate > 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[0].Value
  172. baseDate := calDataList[0].DataTime
  173. if baseVal == 0 {
  174. continue
  175. }
  176. if v.DataTime == baseDate {
  177. continue
  178. }
  179. val := (v.Value - baseVal) / baseVal
  180. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  181. newList = append(newList, &data_manage.EdbDataList{
  182. DataTime: v.DataTime,
  183. Value: val,
  184. DataTimestamp: v.DataTimestamp,
  185. })
  186. }
  187. }
  188. } else {
  189. for _, item := range originList {
  190. if len(item.DataList) == 0 {
  191. break
  192. }
  193. baseVal := item.DataList[0].Value
  194. baseDate := item.DataList[0].DataTime
  195. if baseVal == 0 {
  196. break
  197. }
  198. for _, v := range item.DataList {
  199. if v.DataTime == baseDate {
  200. continue
  201. }
  202. val := (v.Value - baseVal) / baseVal
  203. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  204. newList = append(newList, &data_manage.EdbDataList{
  205. DataTime: v.DataTime,
  206. Value: val,
  207. DataTimestamp: v.DataTimestamp,
  208. })
  209. }
  210. }
  211. }
  212. case 3: //复合增长率
  213. if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
  214. for _, item := range originList {
  215. for _, v := range item.DataList {
  216. var baseVal float64
  217. var baseDate string
  218. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  219. if e != nil {
  220. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  221. return
  222. }
  223. if len(calDataList) == 0 {
  224. continue
  225. }
  226. baseVal = calDataList[0].Value
  227. baseDate = calDataList[0].DataTime
  228. if v.DataTime == baseDate {
  229. continue
  230. }
  231. if baseVal == 0 {
  232. continue
  233. }
  234. baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
  235. if e != nil {
  236. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  237. return
  238. }
  239. tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  240. if e != nil {
  241. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  242. return
  243. }
  244. // 计算两个日期相差的天数
  245. diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
  246. val := v.Value / baseVal
  247. val = math.Pow(val, 1/diff) - 1
  248. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  249. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  250. }
  251. }
  252. } else {
  253. for _, item := range originList {
  254. if len(item.DataList) == 0 {
  255. break
  256. }
  257. baseVal := item.DataList[0].Value
  258. baseDate := item.DataList[0].DataTime
  259. if baseVal == 0 {
  260. break
  261. }
  262. for _, v := range item.DataList {
  263. if v.DataTime == baseDate {
  264. continue
  265. }
  266. baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
  267. if e != nil {
  268. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  269. return
  270. }
  271. tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  272. if e != nil {
  273. err = fmt.Errorf("time.ParseInLocation err: %v", e)
  274. return
  275. }
  276. // 计算两个日期相差的天数
  277. diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
  278. val := v.Value / baseVal
  279. val = math.Pow(val, 1/diff) - 1
  280. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  281. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  282. }
  283. }
  284. }
  285. case 4: //最大值
  286. var maxVal float64
  287. if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
  288. for _, item := range originList {
  289. for _, v := range item.DataList {
  290. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  291. if e != nil {
  292. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  293. return
  294. }
  295. for kk, vv := range calDataList {
  296. if kk == 0 {
  297. maxVal = vv.Value
  298. }
  299. if vv.Value > maxVal {
  300. maxVal = vv.Value
  301. }
  302. }
  303. val := maxVal
  304. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  305. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  306. }
  307. }
  308. } else {
  309. for _, item := range originList {
  310. for k, v := range item.DataList {
  311. if k == 0 {
  312. maxVal = v.Value
  313. }
  314. if v.Value > maxVal {
  315. maxVal = v.Value
  316. }
  317. val := maxVal
  318. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  319. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  320. }
  321. }
  322. }
  323. case 5: //最小值
  324. var minVal float64
  325. if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
  326. for _, item := range originList {
  327. for _, v := range item.DataList {
  328. calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
  329. if e != nil {
  330. err = fmt.Errorf("获取区间数据失败:%s", e.Error())
  331. return
  332. }
  333. for kk, vv := range calDataList {
  334. if kk == 0 {
  335. minVal = vv.Value
  336. }
  337. if vv.Value < minVal {
  338. minVal = vv.Value
  339. }
  340. }
  341. val := minVal
  342. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  343. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  344. }
  345. }
  346. } else {
  347. for _, item := range originList {
  348. for k, v := range item.DataList {
  349. if k == 0 {
  350. minVal = v.Value
  351. }
  352. if v.Value < minVal {
  353. minVal = v.Value
  354. }
  355. val := minVal
  356. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  357. newList = append(newList, &data_manage.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
  358. }
  359. }
  360. }
  361. }
  362. return
  363. }
  364. // GetChartEdbInfoFormat 区间计算图表-获取指标信息
  365. func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingList []*data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
  366. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  367. for _, edbInfoMapping := range edbInfoMappingList {
  368. if edbInfoMapping == nil {
  369. err = fmt.Errorf("指标信息有误")
  370. return
  371. }
  372. edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
  373. if edbInfoMapping.Unit == `无` {
  374. edbInfoMapping.Unit = ``
  375. }
  376. if chartInfoId <= 0 {
  377. edbInfoMapping.IsAxis = 1
  378. edbInfoMapping.LeadValue = 0
  379. edbInfoMapping.LeadUnit = ""
  380. edbInfoMapping.ChartEdbMappingId = 0
  381. edbInfoMapping.ChartInfoId = 0
  382. edbInfoMapping.IsOrder = false
  383. edbInfoMapping.EdbInfoType = 1
  384. edbInfoMapping.ChartStyle = ""
  385. edbInfoMapping.ChartColor = ""
  386. edbInfoMapping.ChartWidth = 0
  387. } else {
  388. edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
  389. }
  390. edbList = append(edbList, edbInfoMapping)
  391. }
  392. return
  393. }
  394. // GetChartDataByEdbInfoList 区间计算图表-根据指标信息获取x轴和y轴
  395. 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) {
  396. if chartInfoId > 0 && req.EdbInfoMode == 1 {
  397. edbList, xEdbIdValue, dataResp, err = GetChartDataByEdbInfoListBySeries(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, req)
  398. return
  399. }
  400. for _, edbInfoMapping := range edbInfoMappingList {
  401. edbInfoMapping, err = getChartDataByEdbInfo(edbInfoMapping, req)
  402. if err != nil {
  403. return
  404. }
  405. edbInfoMapping.ConvertUnit = edbInfoMapping.Unit
  406. edbInfoMapping.ConvertEnUnit = edbInfoMapping.UnitEn
  407. if req.CalculateType == 2 || req.CalculateType == 3 {
  408. edbInfoMapping.ConvertUnit = "无"
  409. edbInfoMapping.ConvertEnUnit = "无"
  410. }
  411. if req.DataConvertType > 0 && req.DataConvertConf.Unit != "" {
  412. edbInfoMapping.ConvertUnit = req.DataConvertConf.Unit
  413. edbInfoMapping.ConvertEnUnit = req.DataConvertConf.Unit
  414. }
  415. dataList := edbInfoMapping.DataList.([]*data_manage.EdbDataList)
  416. // 处理上下限
  417. var maxData, minData float64
  418. if len(dataList) > 0 {
  419. maxData = dataList[0].Value
  420. minData = dataList[0].Value
  421. for _, v := range dataList {
  422. if v.Value > maxData {
  423. maxData = v.Value
  424. }
  425. if v.Value < minData {
  426. minData = v.Value
  427. }
  428. }
  429. }
  430. edbInfoMapping.MaxData = maxData
  431. edbInfoMapping.MinData = minData
  432. xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
  433. }
  434. //根据时间类型来筛选最终的数据
  435. yearMax := 0
  436. if dateType == utils.DateTypeNYears {
  437. for _, v := range edbInfoMappingList {
  438. dataList := v.DataList.([]*data_manage.EdbDataList)
  439. if len(dataList) > 0 {
  440. latestDate := dataList[0].DataTime
  441. if latestDate != "" {
  442. lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
  443. if tErr != nil {
  444. err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
  445. return
  446. }
  447. if lastDateT.Year() > yearMax {
  448. yearMax = lastDateT.Year()
  449. }
  450. }
  451. }
  452. }
  453. }
  454. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  455. if startDate != "" {
  456. for k, v := range edbInfoMappingList {
  457. var maxData, minData float64
  458. dataList := v.DataList.([]*data_manage.EdbDataList)
  459. newDataList := make([]*data_manage.EdbDataList, 0)
  460. if len(dataList) == 0 {
  461. newDataList = dataList
  462. } else {
  463. firstFlag := true
  464. for _, d := range dataList {
  465. if endDate != "" && d.DataTime > endDate {
  466. continue
  467. }
  468. if d.DataTime < startDate {
  469. continue
  470. }
  471. newDataList = append(newDataList, d)
  472. if firstFlag {
  473. maxData = d.Value
  474. minData = d.Value
  475. firstFlag = false
  476. } else {
  477. if d.Value > maxData {
  478. maxData = d.Value
  479. }
  480. if d.Value < minData {
  481. minData = d.Value
  482. }
  483. }
  484. }
  485. }
  486. edbInfoMappingList[k].DataList = newDataList
  487. edbInfoMappingList[k].MinData = minData
  488. edbInfoMappingList[k].MaxData = maxData
  489. }
  490. }
  491. dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req}
  492. if req.MultipleGraphConfigId > 0 {
  493. //判断MultipleGraphConfigId和图表关系是否正确
  494. chartMappingList, e := data_manage.GetMultipleGraphConfigChartMappingListById(req.MultipleGraphConfigId)
  495. if e != nil && e.Error() != utils.ErrNoRow() {
  496. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  497. return
  498. }
  499. if len(chartMappingList) > 0 {
  500. multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
  501. if e != nil && e.Error() != utils.ErrNoRow() {
  502. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  503. return
  504. }
  505. // 查询是否已经生成指标
  506. dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
  507. }
  508. }
  509. edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
  510. if err != nil {
  511. err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
  512. return
  513. }
  514. return
  515. }
  516. 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) {
  517. //查询seriesId
  518. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  519. seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfoId)
  520. if err != nil {
  521. if err.Error() == utils.ErrNoRow() {
  522. err = fmt.Errorf("图表关联关系不存在")
  523. return
  524. } else {
  525. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  526. return
  527. }
  528. }
  529. //根据seriesId查询数据
  530. //并把数据放到dataList中
  531. for _, edbInfoMapping := range edbInfoMappingList {
  532. dataOb := new(data_manage.FactorEdbSeriesCalculateDataQjjs)
  533. dataList, e := dataOb.GetEdbDataList(seriesMappingItem.FactorEdbSeriesId, edbInfoMapping.EdbInfoId, startDate, endDate)
  534. if e != nil {
  535. err = e
  536. return
  537. }
  538. edbInfoMapping.ConvertUnit = edbInfoMapping.Unit
  539. edbInfoMapping.ConvertEnUnit = edbInfoMapping.UnitEn
  540. if req.CalculateType == 2 || req.CalculateType == 3 {
  541. edbInfoMapping.ConvertUnit = "无"
  542. edbInfoMapping.ConvertEnUnit = "无"
  543. }
  544. if req.DataConvertType > 0 && req.DataConvertConf.Unit != "" {
  545. edbInfoMapping.ConvertUnit = req.DataConvertConf.Unit
  546. edbInfoMapping.ConvertEnUnit = req.DataConvertConf.Unit
  547. }
  548. edbInfoMapping.DataList = dataList
  549. // 处理上下限
  550. var maxData, minData float64
  551. if len(dataList) > 0 {
  552. maxData = dataList[0].Value
  553. minData = dataList[0].Value
  554. for _, v := range dataList {
  555. if v.Value > maxData {
  556. maxData = v.Value
  557. }
  558. if v.Value < minData {
  559. minData = v.Value
  560. }
  561. }
  562. }
  563. edbInfoMapping.MaxData = maxData
  564. edbInfoMapping.MinData = minData
  565. xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
  566. }
  567. yearMax := 0
  568. if dateType == utils.DateTypeNYears {
  569. for _, v := range edbInfoMappingList {
  570. dataList := v.DataList.([]*data_manage.EdbDataList)
  571. latestDate := dataList[0].DataTime
  572. if latestDate != "" {
  573. lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
  574. if tErr != nil {
  575. err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
  576. return
  577. }
  578. if lastDateT.Year() > yearMax {
  579. yearMax = lastDateT.Year()
  580. }
  581. }
  582. }
  583. }
  584. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  585. if startDate != "" {
  586. for k, v := range edbInfoMappingList {
  587. var maxData, minData float64
  588. dataList := v.DataList.([]*data_manage.EdbDataList)
  589. newDataList := make([]*data_manage.EdbDataList, 0)
  590. if len(dataList) == 0 {
  591. newDataList = dataList
  592. } else {
  593. firstFlag := true
  594. for _, d := range dataList {
  595. if endDate != "" && d.DataTime > endDate {
  596. continue
  597. }
  598. if d.DataTime < startDate {
  599. continue
  600. }
  601. newDataList = append(newDataList, d)
  602. if firstFlag {
  603. maxData = d.Value
  604. minData = d.Value
  605. firstFlag = false
  606. } else {
  607. if d.Value > maxData {
  608. maxData = d.Value
  609. }
  610. if d.Value < minData {
  611. minData = d.Value
  612. }
  613. }
  614. }
  615. }
  616. edbInfoMappingList[k].DataList = newDataList
  617. edbInfoMappingList[k].MinData = minData
  618. edbInfoMappingList[k].MaxData = maxData
  619. }
  620. }
  621. dataResp = data_manage.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req, SeriesId: seriesMappingItem.FactorEdbSeriesId}
  622. // 查询配置关联关系
  623. if req.MultipleGraphConfigId > 0 {
  624. //判断MultipleGraphConfigId和图表关系是否正确
  625. chartMappingList, e := data_manage.GetMultipleGraphConfigChartMappingListById(req.MultipleGraphConfigId)
  626. if e != nil && e.Error() != utils.ErrNoRow() {
  627. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  628. return
  629. }
  630. if len(chartMappingList) > 0 {
  631. multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
  632. if e != nil && e.Error() != utils.ErrNoRow() {
  633. err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
  634. return
  635. }
  636. // 查询是否已经生成指标
  637. dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
  638. }
  639. }
  640. edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
  641. if err != nil {
  642. err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
  643. return
  644. }
  645. return
  646. }
  647. // getChartDataByEdbInfo 区间计算图表-根据指标信息获取x轴和y轴
  648. func getChartDataByEdbInfo(edbInfoMapping *data_manage.ChartEdbInfoMapping, req *data_manage.ChartRangeAnalysisExtraConf) (newEdbInfoMapping *data_manage.ChartEdbInfoMapping, err error) {
  649. newEdbInfoMapping = edbInfoMapping
  650. // 指标的开始日期和结束日期
  651. edbStartDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.StartDate, time.Local)
  652. //edbStartDate := edbStartDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  653. edbEndDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.EndDate, time.Local)
  654. edbEndDate := edbEndDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  655. // 获取时间基准指标在时间区间内的值
  656. dataList := make([]*data_manage.EdbDataList, 0)
  657. switch edbInfoMapping.EdbInfoCategoryType {
  658. case 0:
  659. dataList, err = data_manage.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.SubSource, edbInfoMapping.EdbInfoId, "", "")
  660. case 1:
  661. _, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfoMapping.EdbInfoId, "", "", false)
  662. default:
  663. err = errors.New("指标base类型异常")
  664. return
  665. }
  666. /*var dataList data_manage.SortEdbDataList
  667. dataList = dataListTmp
  668. ascDataList := dataListTmp
  669. sort.Sort(dataList)*/
  670. dateList := make([]*data_manage.ChartRangeAnalysisDateDataItem, 0)
  671. switch req.DateRangeType {
  672. case 0:
  673. // 智能划分得到一个开始日期,和结束日期
  674. var startDateTime, endDateTime time.Time
  675. startDateTime = edbStartDateTime
  676. if req.AutoDateConf.IsAutoStartDate == 0 { //固定设置
  677. startDate := req.AutoDateConf.StartDate
  678. if startDate == "" {
  679. startDate = "2020-01-01"
  680. }
  681. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  682. } /*else {
  683. startConf := req.AutoDateConf.StartDateConf
  684. startDate := ""
  685. if startConf.BaseDateType == 0 { //
  686. startDate = edbEndDate
  687. } else if startConf.BaseDateType == 1 {
  688. startDate = time.Now().Format(utils.FormatDate)
  689. }
  690. if startConf.MoveForward > 0 {
  691. startDate = GetEdbDateByMoveForward(startConf.MoveForward, dataList)
  692. }
  693. if len(startConf.DateChange) > 0 {
  694. startDate, err = HandleEdbDateChange(startDate, startConf.DateChange)
  695. if err != nil {
  696. err = fmt.Errorf("智能划分开始日期处理失败:%s", err.Error())
  697. return
  698. }
  699. }
  700. startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  701. }*/
  702. if req.AutoDateConf.IsAutoEndDate == 0 { //固定设置
  703. endDate := req.AutoDateConf.EndDate
  704. if endDate == "" {
  705. err = fmt.Errorf("智能划分截止日期处理失败:请输入截止日期")
  706. return
  707. }
  708. // todo 如果截止日期比指标日期还要大,则用指标的最新日期
  709. endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  710. } else {
  711. endConf := req.AutoDateConf.EndDateConf
  712. endDate := edbEndDate
  713. if endConf.MoveForward > 0 {
  714. endDate = GetEdbDateByMoveForward(endDate, endConf.MoveForward, dataList)
  715. }
  716. if len(endConf.DateChange) > 0 {
  717. endDate, err = HandleEdbDateChange(endDate, endConf.DateChange)
  718. if err != nil {
  719. err = fmt.Errorf("智能划分结束日期处理失败:%s", err.Error())
  720. return
  721. }
  722. }
  723. endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  724. }
  725. dateList = append(dateList, &data_manage.ChartRangeAnalysisDateDataItem{
  726. StartDate: startDateTime,
  727. EndDate: endDateTime})
  728. case 1:
  729. // 手工划分得到多个开始日期和结束日期(已排序)
  730. for _, v := range req.ManualDateConf {
  731. startDateT, _ := time.ParseInLocation(utils.FormatDate, v.StartDate, time.Local)
  732. endDateT, _ := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  733. tmp := &data_manage.ChartRangeAnalysisDateDataItem{
  734. StartDate: startDateT,
  735. EndDate: endDateT,
  736. }
  737. dateList = append(dateList, tmp)
  738. }
  739. case 2:
  740. // 跨年划分得到多个开始日期和结束日期
  741. startYear := edbStartDateTime.Year()
  742. endYear := edbEndDateTime.Year()
  743. startDay := req.YearDateConf.StartDay
  744. endDay := req.YearDateConf.EndDay
  745. for year := startYear; year <= endYear; year++ {
  746. startDate := fmt.Sprintf("%d-%s", year, startDay)
  747. endDate := fmt.Sprintf("%d-%s", year+1, endDay)
  748. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  749. endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  750. if startDateTime.Before(edbStartDateTime) {
  751. break
  752. }
  753. tmp := &data_manage.ChartRangeAnalysisDateDataItem{
  754. StartDate: startDateTime,
  755. EndDate: endDateTime,
  756. }
  757. dateList = append(dateList, tmp)
  758. }
  759. }
  760. // 根据日期,获取数据
  761. for _, v := range dateList {
  762. for _, vv := range dataList {
  763. dataTimeT, _ := time.ParseInLocation(utils.FormatDate, vv.DataTime, time.Local)
  764. if dataTimeT.After(v.StartDate) && dataTimeT.Before(v.EndDate) ||
  765. dataTimeT.Equal(v.StartDate) ||
  766. dataTimeT.Equal(v.EndDate) {
  767. v.DataList = append(v.DataList, vv)
  768. }
  769. }
  770. }
  771. // 根据时间区间类型来获取数据的计算窗口,然后再拼接成整段数据
  772. newDataList, err := HandleDataByCalculateType(dateList, dataList, req)
  773. if err != nil {
  774. return
  775. }
  776. if req.UnNormalDataDealType > 0 {
  777. switch req.UnNormalDataDealType { //0:不处理,1:剔除,2替换
  778. case 1:
  779. dealDataList := make([]*data_manage.EdbDataList, 0)
  780. for _, v := range newDataList {
  781. if !utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
  782. dealDataList = append(dealDataList, v)
  783. }
  784. }
  785. case 2:
  786. for i, v := range newDataList {
  787. if utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
  788. newDataList[i].Value = req.UnNormalDataConf.ReplaceValue
  789. }
  790. }
  791. }
  792. }
  793. if req.DataConvertType > 0 {
  794. // 数据转换类型 0不转, 1乘 2除 3对数
  795. switch req.DataConvertType {
  796. case 1:
  797. for i, v := range newDataList {
  798. val := v.Value * req.DataConvertConf.Value
  799. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  800. newDataList[i].Value = val
  801. }
  802. //item.MaxData = item.MaxData * v.ConvertValue
  803. //item.MinData = item.MinData * v.ConvertValue
  804. case 2:
  805. for i, v := range newDataList {
  806. val := v.Value / req.DataConvertConf.Value
  807. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  808. newDataList[i].Value = val
  809. }
  810. //item.MaxData = item.MaxData / v.ConvertValue
  811. //item.MinData = item.MinData / v.ConvertValue
  812. case 3:
  813. for i, v := range newDataList {
  814. if v.Value <= 0 {
  815. err = errors.New("数据中含有负数或0,无法对数运算")
  816. return
  817. }
  818. val := math.Log(v.Value) / math.Log(req.DataConvertConf.Value)
  819. val, _ = decimal.NewFromFloat(val).Round(4).Float64()
  820. newDataList[i].Value = val
  821. }
  822. //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
  823. //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
  824. }
  825. }
  826. newEdbInfoMapping.DataList = newDataList
  827. //时间处理
  828. return
  829. }
  830. // RollingCorrelationChartDataResp 滚动区间计算图表数据
  831. type RollingCorrelationChartDataResp struct {
  832. MaxData float64
  833. MinData float64
  834. LatestDate string `description:"真实数据的最后日期"`
  835. EdbInfoCategoryType int
  836. ChartColor string
  837. ChartStyle string
  838. PredictChartColor string
  839. ChartType int
  840. ChartWidth int
  841. EdbName string
  842. EdbNameEn string
  843. Unit string
  844. UnitEn string
  845. IsAxis int
  846. DataList []data_manage.EdbDataList
  847. }
  848. // ChartInfoRefresh 图表刷新
  849. func ChartInfoRefresh(chartInfoId int, uniqueCode string) (isAsync bool, err error) {
  850. var errMsg string
  851. defer func() {
  852. if err != nil {
  853. tips := fmt.Sprintf("CorrelationChartInfoRefresh: %s", errMsg)
  854. utils.FileLog.Info(tips)
  855. go alarm_msg.SendAlarmMsg(tips, 3)
  856. }
  857. }()
  858. var chartInfo *data_manage.ChartInfo
  859. if chartInfoId > 0 {
  860. chartInfo, err = data_manage.GetChartInfoById(chartInfoId)
  861. if err != nil {
  862. if err.Error() == utils.ErrNoRow() {
  863. errMsg = "图表已被删除,请刷新页面"
  864. err = errors.New(errMsg)
  865. return
  866. }
  867. errMsg = "获取图表信息失败"
  868. err = errors.New("获取图表信息失败,Err:" + err.Error())
  869. return
  870. }
  871. } else {
  872. chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode)
  873. if err != nil {
  874. if err.Error() == utils.ErrNoRow() {
  875. errMsg = "图表已被删除,请刷新页面"
  876. err = errors.New(errMsg)
  877. return
  878. }
  879. errMsg = "获取图表信息失败"
  880. err = errors.New("获取图表信息失败,Err:" + err.Error())
  881. return
  882. }
  883. }
  884. // 1.刷新图表关联的指标
  885. mappings, e := data_manage.GetChartEdbMappingList(chartInfoId)
  886. if e != nil {
  887. utils.FileLog.Info(fmt.Sprintf("获取图表关联指标失败, err: %v", e))
  888. return
  889. }
  890. if len(mappings) == 0 {
  891. utils.FileLog.Info("图表无关联指标")
  892. return
  893. }
  894. var edbIds []int
  895. for _, v := range mappings {
  896. edbIds = append(edbIds, v.EdbInfoId)
  897. }
  898. if e, _ = data.EdbInfoRefreshAllFromBaseV3(edbIds, false, true, false); e != nil {
  899. utils.FileLog.Info(fmt.Sprintf("批量刷新指标失败, err: %v", e))
  900. return
  901. }
  902. // todo 重新计算
  903. // 区间计算图表配置校验
  904. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  905. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
  906. if err != nil {
  907. errMsg = "配置信息错误"
  908. err = errors.New(errMsg + ", Err: " + err.Error())
  909. return
  910. }
  911. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  912. seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfo.ChartInfoId)
  913. if err != nil {
  914. if err.Error() == utils.ErrNoRow() {
  915. err = nil
  916. } else {
  917. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  918. return
  919. }
  920. } else {
  921. _, e = FactorEdbStepCalculateRange(seriesMappingItem.FactorEdbSeriesId, edbIds, extraConfig, true)
  922. if e != nil {
  923. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  924. return
  925. }
  926. }
  927. // 4.清除图表缓存
  928. key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
  929. _ = utils.Rc.Delete(key)
  930. return
  931. }
  932. // AddChartInfo 添加图表
  933. func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  934. isSendEmail = true
  935. req.ChartName = strings.Trim(req.ChartName, " ")
  936. if req.ChartName == "" {
  937. errMsg = "请填写图表名称!"
  938. err = errors.New(errMsg)
  939. isSendEmail = false
  940. return
  941. }
  942. if req.ChartClassifyId <= 0 {
  943. errMsg = "分类参数错误!"
  944. err = errors.New(errMsg)
  945. isSendEmail = false
  946. return
  947. }
  948. // 区间计算图表配置校验
  949. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  950. if req.ExtraConfig == `` {
  951. errMsg = "配置信息错误"
  952. err = errors.New(errMsg)
  953. return
  954. }
  955. err = json.Unmarshal([]byte(req.ExtraConfig), &extraConfig)
  956. if err != nil {
  957. errMsg = "配置信息错误"
  958. err = errors.New(errMsg + ", Err: " + err.Error())
  959. return
  960. }
  961. if len(req.ChartEdbInfoList) <= 0 {
  962. errMsg = "请选择指标"
  963. err = errors.New(errMsg)
  964. isSendEmail = false
  965. return
  966. }
  967. if len(req.ChartEdbInfoList) > 100 {
  968. errMsg = "添加指标总数量不得超过100"
  969. err = errors.New(errMsg)
  970. isSendEmail = false
  971. return
  972. }
  973. err, errMsg, isSendEmail = CheckChartRangeExtraConfig(extraConfig)
  974. if err != nil {
  975. return
  976. }
  977. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  978. if err != nil {
  979. if err.Error() == utils.ErrNoRow() {
  980. errMsg = "分类不存在"
  981. err = errors.New(errMsg)
  982. isSendEmail = false
  983. return
  984. }
  985. errMsg = "获取分类信息失败"
  986. err = errors.New("获取分类信息失败,Err:" + err.Error())
  987. return
  988. }
  989. if chartClassify == nil {
  990. errMsg = "分类不存在"
  991. err = errors.New(errMsg)
  992. isSendEmail = false
  993. return
  994. }
  995. var edbInfoIdArr []int
  996. for _, v := range req.ChartEdbInfoList {
  997. edbInfoId := v.EdbInfoId
  998. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  999. if tmpErr != nil {
  1000. if tmpErr.Error() == utils.ErrNoRow() {
  1001. errMsg = "指标不存在!"
  1002. err = errors.New("指标不存在,edbInfoId:" + strconv.Itoa(edbInfoId))
  1003. return
  1004. } else {
  1005. errMsg = "获取指标信息失败!"
  1006. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  1007. return
  1008. }
  1009. }
  1010. if edbInfo == nil {
  1011. errMsg = "指标已被删除,请重新选择!"
  1012. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  1013. return
  1014. } else {
  1015. if edbInfo.EdbInfoId <= 0 {
  1016. errMsg = "指标已被删除,请重新选择!"
  1017. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  1018. return
  1019. }
  1020. }
  1021. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  1022. edbInfo.EdbNameSource = edbInfo.EdbName
  1023. }
  1024. sort.Ints(edbInfoIdArr)
  1025. var edbInfoIdArrStr []string
  1026. for _, v := range edbInfoIdArr {
  1027. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  1028. }
  1029. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  1030. var chartInfoId int
  1031. // 判断图表是否存在
  1032. {
  1033. var condition string
  1034. var pars []interface{}
  1035. switch lang {
  1036. case utils.EnLangVersion:
  1037. condition += " AND chart_name_en = ? AND source = ? "
  1038. default:
  1039. condition += " AND chart_name=? AND source = ? "
  1040. }
  1041. pars = append(pars, req.ChartName, source)
  1042. count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
  1043. if tmpErr != nil {
  1044. errMsg = "判断图表名称是否存在失败"
  1045. err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
  1046. return
  1047. }
  1048. if count > 0 {
  1049. errMsg = "图表已存在,请重新填写"
  1050. err = errors.New(errMsg)
  1051. isSendEmail = false
  1052. return
  1053. }
  1054. }
  1055. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  1056. chartInfo = new(data_manage.ChartInfo)
  1057. chartInfo.ChartName = req.ChartName
  1058. chartInfo.ChartNameEn = req.ChartName
  1059. chartInfo.EdbInfoIds = edbInfoIdStr
  1060. chartInfo.ChartClassifyId = req.ChartClassifyId
  1061. chartInfo.SysUserId = sysUser.AdminId
  1062. chartInfo.SysUserRealName = sysUser.RealName
  1063. chartInfo.CreateTime = time.Now()
  1064. chartInfo.ModifyTime = time.Now()
  1065. chartInfo.IsSetName = 0
  1066. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  1067. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  1068. chartInfo.ChartType = 1 // 区间计算图
  1069. chartInfo.Calendar = "公历"
  1070. chartInfo.DateType = req.DateType
  1071. chartInfo.StartDate = req.StartDate
  1072. chartInfo.EndDate = req.EndDate
  1073. chartInfo.StartYear = req.StartYear
  1074. chartInfo.SeasonStartDate = req.StartDate
  1075. chartInfo.SeasonEndDate = req.EndDate
  1076. chartInfo.LeftMin = req.LeftMin
  1077. chartInfo.LeftMax = req.LeftMax
  1078. chartInfo.RightMin = req.RightMin
  1079. chartInfo.RightMax = req.RightMax
  1080. chartInfo.Disabled = disableVal
  1081. chartInfo.Source = source
  1082. chartInfo.ChartThemeId = req.ChartThemeId
  1083. chartInfo.SourcesFrom = req.SourcesFrom
  1084. chartInfo.Instructions = req.Instructions
  1085. chartInfo.MarkersLines = req.MarkersLines
  1086. chartInfo.MarkersAreas = req.MarkersAreas
  1087. if req.ExtraConfig != "" {
  1088. chartInfo.ExtraConfig = req.ExtraConfig
  1089. }
  1090. // 指标信息
  1091. mapList := make([]*data_manage.ChartEdbMapping, 0)
  1092. for _, v := range req.ChartEdbInfoList {
  1093. // todo 指标名称修改
  1094. mapItem := new(data_manage.ChartEdbMapping)
  1095. mapItem.EdbInfoId = v.EdbInfoId
  1096. mapItem.EdbAliasName = v.EdbAliasName
  1097. mapItem.IsAxis = v.IsAxis
  1098. mapItem.CreateTime = time.Now()
  1099. mapItem.ModifyTime = time.Now()
  1100. edbTimestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  1101. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + edbTimestamp + "_" + strconv.Itoa(v.EdbInfoId))
  1102. mapItem.IsOrder = false
  1103. mapItem.EdbInfoType = 1
  1104. mapItem.Source = utils.CHART_SOURCE_RANGE_ANALYSIS
  1105. mapList = append(mapList, mapItem)
  1106. }
  1107. // 新增图表和指标mapping
  1108. chartInfoId, e := data_manage.CreateRangeChartAndEdb(chartInfo, mapList)
  1109. if e != nil {
  1110. errMsg = "操作失败"
  1111. err = errors.New("新增区间计算图表失败, Err: " + e.Error())
  1112. return
  1113. }
  1114. // 把系列和图表绑定
  1115. if extraConfig.EdbInfoMode == 1 {
  1116. // 新增指标系列
  1117. err = AddSeries(edbInfoIdArr, chartInfoId, utils.CHART_SOURCE_RANGE_ANALYSIS, extraConfig, req.ExtraConfig)
  1118. if err != nil {
  1119. errMsg = "操作失败"
  1120. err = errors.New("新增区间计算图表失败, Err: " + err.Error())
  1121. return
  1122. }
  1123. //todo 如果保存失败是否要删除
  1124. }
  1125. /*//添加配置信息
  1126. multipleGraphConfig := &data_manage.MultipleGraphConfig{
  1127. //MultipleGraphConfigId: 0,
  1128. SysUserId: sysUser.AdminId,
  1129. SysUserRealName: sysUser.RealName,
  1130. ModifyTime: time.Now(),
  1131. CreateTime: time.Now(),
  1132. }
  1133. err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
  1134. if err != nil {
  1135. errMsg = "操作失败"
  1136. err = errors.New("新增区间计算图表配置失败, Err: " + err.Error())
  1137. return
  1138. }*/
  1139. if extraConfig.MultipleGraphConfigId > 0 {
  1140. multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
  1141. //Id: 0,
  1142. MultipleGraphConfigId: extraConfig.MultipleGraphConfigId,
  1143. ChartInfoId: chartInfo.ChartInfoId,
  1144. Source: utils.CHART_SOURCE_RANGE_ANALYSIS,
  1145. ModifyTime: time.Now(),
  1146. CreateTime: time.Now(),
  1147. }
  1148. err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
  1149. if err != nil {
  1150. errMsg = "操作失败"
  1151. err = errors.New("新增区间计算图表和配置关联关系失败, Err: " + err.Error())
  1152. return
  1153. }
  1154. }
  1155. // 添加指标引用记录
  1156. _ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
  1157. //添加es数据
  1158. go data.EsAddOrEditChartInfo(chartInfoId)
  1159. return
  1160. }
  1161. // EditChartInfo 编辑图表
  1162. func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang string) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  1163. isSendEmail = true
  1164. chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
  1165. if err != nil {
  1166. if err.Error() == utils.ErrNoRow() {
  1167. errMsg = "图表已被删除,请刷新页面"
  1168. err = errors.New(errMsg)
  1169. isSendEmail = false
  1170. return
  1171. }
  1172. errMsg = "获取图表信息失败"
  1173. err = errors.New("获取图表信息失败,Err:" + err.Error())
  1174. return
  1175. }
  1176. if chartItem.Source != utils.CHART_SOURCE_RANGE_ANALYSIS {
  1177. errMsg = "该图不是区间计算图表!"
  1178. err = errors.New(errMsg)
  1179. isSendEmail = false
  1180. return
  1181. }
  1182. req.ChartName = strings.Trim(req.ChartName, " ")
  1183. if req.ChartClassifyId <= 0 {
  1184. errMsg = "分类参数错误!"
  1185. err = errors.New(errMsg)
  1186. isSendEmail = false
  1187. return
  1188. }
  1189. // 区间计算图表配置校验
  1190. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  1191. if req.ExtraConfig == `` {
  1192. errMsg = "配置信息错误"
  1193. err = errors.New(errMsg)
  1194. return
  1195. }
  1196. err = json.Unmarshal([]byte(req.ExtraConfig), &extraConfig)
  1197. if err != nil {
  1198. errMsg = "配置信息错误"
  1199. err = errors.New(errMsg)
  1200. return
  1201. }
  1202. if len(req.ChartEdbInfoList) <= 0 {
  1203. errMsg = "请选择指标"
  1204. err = errors.New(errMsg)
  1205. isSendEmail = false
  1206. return
  1207. }
  1208. extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
  1209. if len(req.ChartEdbInfoList) > 100 {
  1210. errMsg = "添加指标总数量不得超过100"
  1211. err = errors.New(errMsg)
  1212. isSendEmail = false
  1213. return
  1214. }
  1215. err, errMsg, isSendEmail = CheckChartRangeExtraConfig(extraConfig)
  1216. if err != nil {
  1217. return
  1218. }
  1219. chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
  1220. if err != nil {
  1221. if err.Error() == utils.ErrNoRow() {
  1222. errMsg = "分类不存在"
  1223. err = errors.New(errMsg)
  1224. isSendEmail = false
  1225. return
  1226. }
  1227. errMsg = "获取分类信息失败"
  1228. err = errors.New("获取分类信息失败,Err:" + err.Error())
  1229. return
  1230. }
  1231. if chartClassify == nil {
  1232. errMsg = "分类不存在"
  1233. err = errors.New(errMsg)
  1234. isSendEmail = false
  1235. return
  1236. }
  1237. // 图表操作权限
  1238. ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId, true)
  1239. if !ok {
  1240. errMsg = "没有该图表的操作权限"
  1241. err = errors.New(errMsg)
  1242. isSendEmail = false
  1243. return
  1244. }
  1245. var edbInfoIdArr []int
  1246. for _, v := range req.ChartEdbInfoList {
  1247. edbInfoId := v.EdbInfoId
  1248. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  1249. if tmpErr != nil {
  1250. if tmpErr.Error() == utils.ErrNoRow() {
  1251. errMsg = "图表不存在!"
  1252. err = errors.New("图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  1253. return
  1254. } else {
  1255. errMsg = "获取图表信息失败!"
  1256. err = errors.New("获取图表的指标信息失败,Err:" + tmpErr.Error())
  1257. return
  1258. }
  1259. }
  1260. if edbInfo == nil {
  1261. errMsg = "指标不存在!"
  1262. err = errors.New("指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId))
  1263. return
  1264. }
  1265. edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
  1266. }
  1267. sort.Ints(edbInfoIdArr)
  1268. var edbInfoIdArrStr []string
  1269. for _, v := range edbInfoIdArr {
  1270. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  1271. }
  1272. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  1273. //判断图表是否存在
  1274. {
  1275. var condition string
  1276. var pars []interface{}
  1277. condition += " AND chart_info_id <> ? "
  1278. pars = append(pars, req.ChartInfoId)
  1279. switch lang {
  1280. case utils.EnLangVersion:
  1281. condition += " AND chart_name_en = ? AND source = ? "
  1282. default:
  1283. condition += " AND chart_name=? AND source = ? "
  1284. }
  1285. pars = append(pars, req.ChartName, chartItem.Source)
  1286. count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
  1287. if tmpErr != nil {
  1288. errMsg = "判断图表名称是否存在失败"
  1289. err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
  1290. return
  1291. }
  1292. if count > 0 {
  1293. errMsg = "图表已存在,请重新填写"
  1294. err = errors.New(errMsg)
  1295. isSendEmail = false
  1296. return
  1297. }
  1298. }
  1299. // 修改图表与指标mapping
  1300. req.ChartType = 1
  1301. dateType := req.DateType
  1302. err = data_manage.EditRangeChartInfoAndMapping(&req, edbInfoIdStr, lang, "公历", dateType, 0, ``)
  1303. if err != nil {
  1304. errMsg = "保存失败"
  1305. err = errors.New("保存失败,Err:" + err.Error())
  1306. return
  1307. }
  1308. addSeries := false
  1309. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  1310. seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartItem.ChartInfoId)
  1311. if err != nil {
  1312. if err.Error() == utils.ErrNoRow() {
  1313. err = nil
  1314. addSeries = true
  1315. } else {
  1316. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  1317. return
  1318. }
  1319. }
  1320. if extraConfig.EdbInfoMode == 1 {
  1321. if addSeries {
  1322. // 新增指标系列
  1323. err = AddSeries(edbInfoIdArr, chartItem.ChartInfoId, utils.CHART_SOURCE_RANGE_ANALYSIS, extraConfig, req.ExtraConfig)
  1324. if err != nil {
  1325. errMsg = "操作失败"
  1326. err = errors.New("新增区间计算图表失败, Err: " + err.Error())
  1327. return
  1328. }
  1329. } else {
  1330. err = EditSeries(seriesMappingItem, edbInfoIdArr, extraConfig, req.ExtraConfig, true)
  1331. if err != nil {
  1332. errMsg = "保存失败"
  1333. err = errors.New("保存失败,Err:" + err.Error())
  1334. return
  1335. }
  1336. }
  1337. // todo 编辑失败处理
  1338. } else if extraConfig.EdbInfoMode == 0 {
  1339. if !addSeries {
  1340. // 删除相关的系列
  1341. factorSeriesOb := new(data_manage.FactorEdbSeries)
  1342. err = factorSeriesOb.RemoveSeriesAndMappingByFactorEdbSeriesId(seriesMappingItem)
  1343. if err != nil {
  1344. errMsg = "保存失败"
  1345. err = errors.New("保存失败,Err:" + err.Error())
  1346. return
  1347. }
  1348. }
  1349. }
  1350. resp := new(data_manage.AddChartInfoResp)
  1351. resp.ChartInfoId = chartItem.ChartInfoId
  1352. resp.UniqueCode = chartItem.UniqueCode
  1353. resp.ChartType = req.ChartType
  1354. // 添加指标引用记录
  1355. _ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartItem)
  1356. //添加es数据
  1357. go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
  1358. //修改my eta es数据
  1359. go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
  1360. return
  1361. }
  1362. // CopyChartInfo 复制图表
  1363. 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) {
  1364. isSendEmail = true
  1365. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  1366. var extraConfig data_manage.ChartRangeAnalysisExtraConf
  1367. err = json.Unmarshal([]byte(oldChartInfo.ExtraConfig), &extraConfig)
  1368. if err != nil {
  1369. errMsg = "配置信息错误"
  1370. err = errors.New(errMsg + ", Err: " + err.Error())
  1371. return
  1372. }
  1373. extraConfig.MultipleGraphConfigId = 0
  1374. newExtraConfigBytes, err := json.Marshal(extraConfig)
  1375. if err != nil {
  1376. errMsg = "配置信息错误"
  1377. err = errors.New(errMsg + ", Err: " + err.Error())
  1378. return
  1379. }
  1380. newExtraConfig := string(newExtraConfigBytes)
  1381. chartInfo = &data_manage.ChartInfo{
  1382. ChartInfoId: 0,
  1383. ChartName: chartName,
  1384. ChartClassifyId: classifyId,
  1385. SysUserId: sysUser.AdminId,
  1386. SysUserRealName: sysUser.RealName,
  1387. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  1388. CreateTime: time.Now(),
  1389. ModifyTime: time.Now(),
  1390. DateType: oldChartInfo.DateType,
  1391. StartDate: oldChartInfo.StartDate,
  1392. EndDate: oldChartInfo.EndDate,
  1393. IsSetName: oldChartInfo.IsSetName,
  1394. EdbInfoIds: oldChartInfo.EdbInfoIds,
  1395. ChartType: oldChartInfo.ChartType,
  1396. Calendar: oldChartInfo.Calendar,
  1397. SeasonStartDate: oldChartInfo.SeasonStartDate,
  1398. SeasonEndDate: oldChartInfo.SeasonEndDate,
  1399. ChartImage: oldChartInfo.ChartImage,
  1400. BarConfig: oldChartInfo.BarConfig,
  1401. //Sort: sort,
  1402. LeftMin: oldChartInfo.LeftMin,
  1403. LeftMax: oldChartInfo.LeftMax,
  1404. RightMin: oldChartInfo.RightMin,
  1405. RightMax: oldChartInfo.RightMax,
  1406. Right2Min: oldChartInfo.Right2Min,
  1407. Right2Max: oldChartInfo.Right2Max,
  1408. Disabled: oldChartInfo.Disabled,
  1409. Source: oldChartInfo.Source,
  1410. ExtraConfig: newExtraConfig,
  1411. SeasonExtraConfig: oldChartInfo.SeasonExtraConfig,
  1412. StartYear: oldChartInfo.StartYear,
  1413. Unit: oldChartInfo.Unit,
  1414. UnitEn: oldChartInfo.UnitEn,
  1415. ChartThemeId: oldChartInfo.ChartThemeId,
  1416. SourcesFrom: oldChartInfo.SourcesFrom,
  1417. Instructions: oldChartInfo.Instructions,
  1418. MarkersLines: oldChartInfo.MarkersLines,
  1419. MarkersAreas: oldChartInfo.MarkersAreas,
  1420. }
  1421. newId, err := data_manage.AddChartInfo(chartInfo)
  1422. if err != nil {
  1423. err = fmt.Errorf("保存失败,Err:%s", err.Error())
  1424. return
  1425. }
  1426. chartInfo.ChartInfoId = int(newId)
  1427. edbInfoMappingList, err := data_manage.GetChartMappingList(oldChartInfo.ChartInfoId)
  1428. if err != nil {
  1429. err = fmt.Errorf("获取图表,指标信息失败,Err:" + err.Error())
  1430. return
  1431. }
  1432. // 添加图表与指标的关联关系
  1433. edbInfoIdArr := make([]int, 0)
  1434. {
  1435. mapList := make([]*data_manage.ChartEdbMapping, 0)
  1436. for _, v := range edbInfoMappingList {
  1437. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  1438. timestamp = strconv.FormatInt(time.Now().UnixNano(), 10)
  1439. mapItem := &data_manage.ChartEdbMapping{
  1440. //ChartEdbMappingId: 0,
  1441. ChartInfoId: chartInfo.ChartInfoId,
  1442. EdbInfoId: v.EdbInfoId,
  1443. CreateTime: time.Now(),
  1444. ModifyTime: time.Now(),
  1445. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
  1446. MaxData: v.MaxData,
  1447. MinData: v.MinData,
  1448. IsOrder: v.IsOrder,
  1449. IsAxis: v.IsAxis,
  1450. EdbInfoType: v.EdbInfoType,
  1451. LeadValue: v.LeadValue,
  1452. LeadUnit: v.LeadUnit,
  1453. ChartStyle: v.ChartStyle,
  1454. ChartColor: v.ChartColor,
  1455. ChartWidth: v.ChartWidth,
  1456. Source: v.Source,
  1457. EdbAliasName: v.EdbAliasName,
  1458. IsConvert: v.IsConvert,
  1459. ConvertType: v.ConvertType,
  1460. ConvertValue: v.ConvertValue,
  1461. ConvertUnit: v.ConvertEnUnit,
  1462. ConvertEnUnit: v.ConvertEnUnit,
  1463. }
  1464. mapList = append(mapList, mapItem)
  1465. }
  1466. err = data_manage.AddChartEdbMapping(mapList)
  1467. if err != nil {
  1468. err = fmt.Errorf("保存失败,Err:%s", err.Error())
  1469. return
  1470. }
  1471. }
  1472. // 添加系列和图表映射
  1473. chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
  1474. _, err = chartSeriesOb.GetItemByChartInfoId(oldChartInfo.ChartInfoId)
  1475. if err != nil {
  1476. if err.Error() == utils.ErrNoRow() {
  1477. err = nil
  1478. } else {
  1479. err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
  1480. return
  1481. }
  1482. } else {
  1483. // 新增指标系列
  1484. // 区间计算图表配置校验
  1485. err = AddSeries(edbInfoIdArr, chartInfo.ChartInfoId, utils.CHART_SOURCE_RANGE_ANALYSIS, extraConfig, chartInfo.ExtraConfig)
  1486. if err != nil {
  1487. errMsg = "操作失败"
  1488. err = errors.New("新增区间计算图表失败, Err: " + err.Error())
  1489. return
  1490. }
  1491. }
  1492. //添加es数据
  1493. go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  1494. return
  1495. }
  1496. /*
  1497. // CalculateCorrelation 计算区间计算-获取x轴和y轴
  1498. func CalculateCorrelation(leadValue int, leadUnit, frequencyA, frequencyB string, dataListA, dataListB []*data_manage.EdbDataList) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
  1499. xData := make([]int, 0)
  1500. yData := make([]float64, 0)
  1501. if leadValue == 0 {
  1502. xData = append(xData, 0)
  1503. }
  1504. if leadValue > 0 {
  1505. leadMin := 0 - leadValue
  1506. xLen := 2*leadValue + 1
  1507. for i := 0; i < xLen; i++ {
  1508. n := leadMin + i
  1509. xData = append(xData, n)
  1510. }
  1511. }
  1512. // 计算窗口,不包含第一天
  1513. //startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  1514. //startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  1515. //// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
  1516. //baseEdbInfo := edbInfoMappingB
  1517. //changeEdbInfo := edbInfoMappingA
  1518. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  1519. //baseEdbInfo := edbInfoMappingA
  1520. //changeEdbInfo := edbInfoMappingB
  1521. // 获取时间基准指标在时间区间内的值
  1522. //aDataList := make([]*data_manage.EdbDataList, 0)
  1523. //switch baseEdbInfo.EdbInfoCategoryType {
  1524. //case 0:
  1525. // aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, startDate, endDate)
  1526. //case 1:
  1527. // _, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
  1528. //default:
  1529. // err = errors.New("指标base类型异常")
  1530. // return
  1531. //}
  1532. //
  1533. //// 获取变频指标所有日期的值, 插值法完善数据
  1534. //bDataList := make([]*data_manage.EdbDataList, 0)
  1535. //switch changeEdbInfo.EdbInfoCategoryType {
  1536. //case 0:
  1537. // bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.SubSource, changeEdbInfo.EdbInfoId, "", "")
  1538. //case 1:
  1539. // _, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
  1540. //default:
  1541. // err = errors.New("指标change类型异常")
  1542. // return
  1543. //}
  1544. //changeDataMap := make(map[string]float64)
  1545. //newChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
  1546. //if e != nil {
  1547. // err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1548. // return
  1549. //}
  1550. // 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
  1551. baseDataList := make([]*data_manage.EdbDataList, 0)
  1552. baseDataMap := make(map[string]float64)
  1553. changeDataList := make([]*data_manage.EdbDataList, 0)
  1554. changeDataMap := make(map[string]float64)
  1555. // 先把低频指标升频为高频
  1556. {
  1557. frequencyIntMap := map[string]int{
  1558. "日度": 1,
  1559. "周度": 2,
  1560. "旬度": 3,
  1561. "月度": 4,
  1562. "季度": 5,
  1563. "年度": 6,
  1564. }
  1565. // 如果A指标是高频,那么就需要对B指标进行升频
  1566. if frequencyIntMap[frequencyA] < frequencyIntMap[frequencyB] {
  1567. tmpNewChangeDataList, e := HandleDataByLinearRegression(dataListB, changeDataMap)
  1568. if e != nil {
  1569. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1570. return
  1571. }
  1572. changeDataList = tmpNewChangeDataList
  1573. baseDataList = dataListA
  1574. for _, v := range baseDataList {
  1575. baseDataMap[v.DataTime] = v.Value
  1576. }
  1577. } else if frequencyIntMap[frequencyA] > frequencyIntMap[frequencyB] {
  1578. // 如果B指标是高频,那么就需要对A指标进行升频
  1579. tmpNewChangeDataList, e := HandleDataByLinearRegression(dataListA, baseDataMap)
  1580. if e != nil {
  1581. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  1582. return
  1583. }
  1584. baseDataList = tmpNewChangeDataList
  1585. changeDataList = dataListB
  1586. for _, v := range changeDataList {
  1587. changeDataMap[v.DataTime] = v.Value
  1588. }
  1589. } else {
  1590. baseDataList = dataListA
  1591. for _, v := range baseDataList {
  1592. baseDataMap[v.DataTime] = v.Value
  1593. }
  1594. changeDataList = dataListB
  1595. for _, v := range changeDataList {
  1596. changeDataMap[v.DataTime] = v.Value
  1597. }
  1598. }
  1599. }
  1600. // 计算不领先也不滞后时的相关系数
  1601. baseCalculateData := make([]float64, 0)
  1602. baseDataTimeArr := make([]string, 0)
  1603. for i := range baseDataList {
  1604. baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
  1605. baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
  1606. }
  1607. //zeroBaseData := make([]float64, 0)
  1608. //zeroCalculateData := make([]float64, 0)
  1609. //for i := range baseDataTimeArr {
  1610. // tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
  1611. // tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
  1612. // if ok1 && ok2 {
  1613. // zeroBaseData = append(zeroBaseData, tmpBaseVal)
  1614. // zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
  1615. // }
  1616. //}
  1617. //if len(zeroBaseData) != len(zeroCalculateData) {
  1618. // err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
  1619. // return
  1620. //}
  1621. //zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
  1622. //if leadValue == 0 {
  1623. // yData = append(yData, zeroRatio)
  1624. //}
  1625. // 计算领先/滞后N期
  1626. if leadValue > 0 {
  1627. // 平移变频指标领先/滞后的日期(单位天)
  1628. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  1629. for i := range xData {
  1630. //if xData[i] == 0 {
  1631. // yData = append(yData, zeroRatio)
  1632. // continue
  1633. //}
  1634. xCalculateData := make([]float64, 0)
  1635. yCalculateData := make([]float64, 0)
  1636. // 平移指定天数
  1637. mDays := int(moveUnitDays) * xData[i]
  1638. _, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
  1639. // 取出对应的基准日期的值
  1640. for i2 := range baseDataTimeArr {
  1641. tmpDate := baseDataTimeArr[i2]
  1642. if yVal, ok := dMap[tmpDate]; ok {
  1643. xCalculateData = append(xCalculateData, baseCalculateData[i2])
  1644. yCalculateData = append(yCalculateData, yVal)
  1645. }
  1646. }
  1647. if len(yCalculateData) <= 0 {
  1648. //err = fmt.Errorf("领先滞后相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(yCalculateData))
  1649. //return
  1650. // 领先滞后后,没有可以计算的数据了
  1651. continue
  1652. }
  1653. // 公式计算出领先/滞后频度对应点的区间计算系数
  1654. ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
  1655. yData = append(yData, ratio)
  1656. }
  1657. }
  1658. xEdbIdValue = xData
  1659. yDataList = make([]data_manage.YData, 0)
  1660. yDate := "0000-00-00"
  1661. yDataList = append(yDataList, data_manage.YData{
  1662. Date: yDate,
  1663. Value: yData,
  1664. })
  1665. return
  1666. }
  1667. // GetFactorChartDataByChartId 获取多因子区间计算图表数据
  1668. func GetFactorChartDataByChartId(chartInfoId int, extraConfig string) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
  1669. if chartInfoId <= 0 {
  1670. return
  1671. }
  1672. // 指标对应的图例
  1673. extra := new(data_manage.CorrelationChartInfoExtraConfig)
  1674. if extraConfig != "" {
  1675. if e := json.Unmarshal([]byte(extraConfig), extra); e != nil {
  1676. err = fmt.Errorf("解析图表额外配置失败, err: %v", e)
  1677. return
  1678. }
  1679. }
  1680. legends := make(map[string]*data_manage.CorrelationChartLegend)
  1681. if extra != nil {
  1682. for _, v := range extra.LegendConfig {
  1683. s := fmt.Sprintf("%d-%d", v.SeriesId, v.EdbInfoId)
  1684. legends[s] = v
  1685. }
  1686. }
  1687. // 获取图表引用到的系列指标
  1688. chartMappingOb := new(data_manage.FactorEdbSeriesChartMapping)
  1689. cond := fmt.Sprintf(" AND %s = ? AND %s = 1", chartMappingOb.Cols().ChartInfoId, chartMappingOb.Cols().EdbUsed)
  1690. pars := make([]interface{}, 0)
  1691. pars = append(pars, chartInfoId)
  1692. chartMappings, e := chartMappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  1693. if e != nil {
  1694. err = fmt.Errorf("获取图表引用系列指标失败")
  1695. return
  1696. }
  1697. // 取出计算结果
  1698. yDataList = make([]data_manage.YData, 0)
  1699. yDate := "0000-00-00"
  1700. for k, m := range chartMappings {
  1701. var values []data_manage.FactorEdbSeriesCorrelationMatrixValues
  1702. if m.CalculateData != "" {
  1703. e = json.Unmarshal([]byte(m.CalculateData), &values)
  1704. if e != nil {
  1705. err = fmt.Errorf("系列指标计算数据有误, err: %v", e)
  1706. return
  1707. }
  1708. }
  1709. var y []float64
  1710. for _, v := range values {
  1711. if k == 0 {
  1712. xEdbIdValue = append(xEdbIdValue, v.XData)
  1713. }
  1714. y = append(y, v.YData)
  1715. }
  1716. var yData data_manage.YData
  1717. yData.Date = yDate
  1718. yData.Value = y
  1719. yData.SeriesEdb.SeriesId = m.FactorEdbSeriesId
  1720. yData.SeriesEdb.EdbInfoId = m.EdbInfoId
  1721. // 图例
  1722. s := fmt.Sprintf("%d-%d", m.FactorEdbSeriesId, m.EdbInfoId)
  1723. legend := legends[s]
  1724. if legend != nil {
  1725. yData.Name = legend.LegendName
  1726. yData.Color = legend.Color
  1727. }
  1728. yDataList = append(yDataList, yData)
  1729. }
  1730. return
  1731. }
  1732. // FormatChartEdbInfoMappings 补充指标信息
  1733. func FormatChartEdbInfoMappings(chartInfoId int, mappings []*data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
  1734. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  1735. if len(mappings) == 0 {
  1736. return
  1737. }
  1738. for _, v := range mappings {
  1739. if chartInfoId <= 0 {
  1740. v.IsAxis = 1
  1741. v.LeadValue = 0
  1742. v.LeadUnit = ""
  1743. v.ChartEdbMappingId = 0
  1744. v.ChartInfoId = 0
  1745. v.IsOrder = false
  1746. v.EdbInfoType = 1
  1747. v.ChartStyle = ""
  1748. v.ChartColor = ""
  1749. v.ChartWidth = 0
  1750. } else {
  1751. v.LeadUnitEn = data.GetLeadUnitEn(v.LeadUnit)
  1752. v.LeadUnitEn = data.GetLeadUnitEn(v.LeadUnit)
  1753. }
  1754. v.FrequencyEn = data.GetFrequencyEn(v.Frequency)
  1755. if v.Unit == `无` {
  1756. v.Unit = ``
  1757. }
  1758. edbList = append(edbList, v)
  1759. }
  1760. return
  1761. }*/
  1762. func GetEdbDateByMoveForward(startDate string, moveForward int, edbDataList []*data_manage.EdbDataList) (date string) {
  1763. // 根据日期进行排序
  1764. index := 0
  1765. // 把正序的指标改成倒序
  1766. var dataList data_manage.SortEdbDataList
  1767. dataList = edbDataList
  1768. sort.Sort(dataList)
  1769. for _, v := range dataList {
  1770. if v.DataTime == startDate {
  1771. index += 1
  1772. continue
  1773. }
  1774. if index >= moveForward {
  1775. date = v.DataTime
  1776. break
  1777. }
  1778. if index > 0 {
  1779. index += 1
  1780. }
  1781. }
  1782. return
  1783. }
  1784. // HandleEdbDateChange 处理日期变换
  1785. func HandleEdbDateChange(date string, dateChange []*data_manage.EdbDataDateChangeConf) (newDate string, err error) {
  1786. newDate = date
  1787. if newDate != "" {
  1788. if len(dateChange) > 0 {
  1789. var dateTime time.Time
  1790. dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
  1791. if err != nil {
  1792. err = fmt.Errorf("日期解析失败: %s", err.Error())
  1793. return
  1794. }
  1795. for _, v := range dateChange {
  1796. if v.ChangeType == 1 {
  1797. dateTime = dateTime.AddDate(v.Year, v.Month, v.Day)
  1798. newDate = dateTime.Format(utils.FormatDate)
  1799. } else if v.ChangeType == 2 {
  1800. newDate, err, _ = utils.HandleSystemAppointDateT(dateTime, v.FrequencyDay, v.Frequency)
  1801. if err != nil {
  1802. return
  1803. }
  1804. dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
  1805. if err != nil {
  1806. err = fmt.Errorf("日期解析失败: %s", err.Error())
  1807. return
  1808. }
  1809. }
  1810. }
  1811. }
  1812. }
  1813. return
  1814. }
  1815. // 添加指标系列和数据
  1816. func AddSeries(edbInfoIds []int, chartInfoId, chartInfoSource int, extraConf data_manage.ChartRangeAnalysisExtraConf, calculatesJson string) (err error) {
  1817. edbArr, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  1818. if e != nil {
  1819. err = fmt.Errorf("获取指标列表失败, Err: " + e.Error())
  1820. return
  1821. }
  1822. if len(edbArr) == 0 {
  1823. err = fmt.Errorf("获取指标列表失败, 指标不存在")
  1824. return
  1825. }
  1826. edbInfoType := edbArr[0].EdbInfoType
  1827. // 新增指标系列
  1828. seriesItem := new(data_manage.FactorEdbSeries)
  1829. seriesItem.SeriesName = extraConf.SeriesName
  1830. seriesItem.EdbInfoType = edbInfoType
  1831. seriesItem.CreateTime = time.Now().Local()
  1832. seriesItem.ModifyTime = time.Now().Local()
  1833. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  1834. seriesItem.CalculateStep = calculatesJson
  1835. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  1836. for _, v := range edbArr {
  1837. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  1838. EdbInfoId: v.EdbInfoId,
  1839. EdbCode: v.EdbCode,
  1840. CreateTime: time.Now().Local(),
  1841. ModifyTime: time.Now().Local(),
  1842. })
  1843. }
  1844. seriesId, e := seriesItem.CreateSeriesAndMapping(seriesItem, mappings)
  1845. if e != nil {
  1846. err = fmt.Errorf("新增因子指标系列失败, Err: " + e.Error())
  1847. return
  1848. }
  1849. // 图表关联-此处添加的chart_info_id=0
  1850. seriesChartMapping := new(data_manage.FactorEdbSeriesChartMapping)
  1851. seriesChartMapping.CalculateType = data_manage.FactorEdbSeriesChartCalculateTypeRange
  1852. //新增图表和指标的映射关系
  1853. seriesChartMapping.CalculateData = ""
  1854. seriesChartMapping.FactorEdbSeriesId = seriesId
  1855. seriesChartMapping.ChartInfoId = chartInfoId
  1856. seriesChartMapping.Source = chartInfoSource
  1857. seriesChartMapping.CreateTime = time.Now().Local()
  1858. seriesChartMapping.ModifyTime = time.Now().Local()
  1859. if e = seriesChartMapping.Create(); e != nil {
  1860. err = fmt.Errorf("新增图表关联失败, Err: " + e.Error())
  1861. return
  1862. }
  1863. // todo 计算指标数据并存储
  1864. _, e = FactorEdbStepCalculateRange(seriesId, edbInfoIds, extraConf, false)
  1865. if e != nil {
  1866. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  1867. return
  1868. }
  1869. // 更新系列计算状态
  1870. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  1871. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  1872. seriesItem.ModifyTime = time.Now().Local()
  1873. if e = seriesItem.Update(cols); e != nil {
  1874. err = fmt.Errorf("更新因子指标系列计算状态失败, Err: " + e.Error())
  1875. return
  1876. }
  1877. return
  1878. }
  1879. func EditSeries(seriesMapping *data_manage.FactorEdbSeriesChartMapping, edbInfoIds []int, extraConf data_manage.ChartRangeAnalysisExtraConf, calculatesJson string, recalculate bool) (err error) {
  1880. seriesOb := new(data_manage.FactorEdbSeries)
  1881. seriesItem, e := seriesOb.GetItemById(seriesMapping.FactorEdbSeriesId)
  1882. if e != nil {
  1883. if e.Error() == utils.ErrNoRow() {
  1884. err = fmt.Errorf("因子指标系列不存在, Err: " + e.Error())
  1885. return
  1886. }
  1887. err = fmt.Errorf("获取因子指标系列失败, Err: " + e.Error())
  1888. return
  1889. }
  1890. edbArr, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  1891. if e != nil {
  1892. err = fmt.Errorf("获取指标列表失败, Err: " + e.Error())
  1893. return
  1894. }
  1895. if len(edbArr) == 0 {
  1896. err = fmt.Errorf("指标列表为空")
  1897. return
  1898. }
  1899. var calculateResp data_manage.FactorEdbSeriesStepCalculateResp
  1900. calculateResp.SeriesId = seriesItem.FactorEdbSeriesId
  1901. // 如果不需要进行重新计算(比如只改了系列名称)那么只更新指标系列
  1902. seriesItem.SeriesName = extraConf.SeriesName
  1903. seriesItem.EdbInfoType = edbArr[0].EdbInfoType
  1904. seriesItem.ModifyTime = time.Now().Local()
  1905. updateCols := []string{seriesOb.Cols().SeriesName, seriesOb.Cols().EdbInfoType, seriesOb.Cols().ModifyTime}
  1906. if !recalculate {
  1907. if e = seriesItem.Update(updateCols); e != nil {
  1908. err = fmt.Errorf("更新因子指标系列失败, Err: " + e.Error())
  1909. return
  1910. }
  1911. return
  1912. }
  1913. // 更新系列信息和指标关联
  1914. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  1915. seriesItem.CalculateStep = calculatesJson
  1916. updateCols = append(updateCols, seriesOb.Cols().CalculateState, seriesOb.Cols().CalculateStep)
  1917. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  1918. for _, v := range edbArr {
  1919. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  1920. EdbInfoId: v.EdbInfoId,
  1921. EdbCode: v.EdbCode,
  1922. CreateTime: time.Now().Local(),
  1923. ModifyTime: time.Now().Local(),
  1924. })
  1925. }
  1926. if e = seriesItem.EditSeriesAndMapping(seriesItem, mappings, updateCols); e != nil {
  1927. err = fmt.Errorf("更新因子指标系列信息失败, Err: %s", e.Error())
  1928. return
  1929. }
  1930. // todo 重新计算
  1931. _, e = FactorEdbStepCalculateRange(seriesItem.FactorEdbSeriesId, edbInfoIds, extraConf, false)
  1932. if e != nil {
  1933. err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
  1934. return
  1935. }
  1936. // 更新系列计算状态
  1937. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  1938. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  1939. seriesItem.ModifyTime = time.Now().Local()
  1940. if e = seriesItem.Update(cols); e != nil {
  1941. err = fmt.Errorf("更新因子指标系列计算状态失败, Err: %s", e.Error())
  1942. return
  1943. }
  1944. return
  1945. }
  1946. // FactorEdbStepCalculateRange 因子指标-区间计算
  1947. func FactorEdbStepCalculateRange(seriesId int, edbArr []int, extraConf data_manage.ChartRangeAnalysisExtraConf, recalculate bool) (calculateResp data_manage.FactorEdbSeriesStepCalculateResp, err error) {
  1948. // todo 如果指标已保存,则用指标数据还是图表指标数据?
  1949. // 获取图表x轴y轴
  1950. defer func() {
  1951. if err != nil {
  1952. tips := fmt.Sprintf("StepCalculate计算失败, ErrMsg: %v", err)
  1953. fmt.Println(tips)
  1954. utils.FileLog.Info(tips)
  1955. go alarm_msg.SendAlarmMsg(tips, 3)
  1956. }
  1957. /*if len(calculateResp.Fail) > 0 {
  1958. tips := "StepCalculate计算失败, ErrMsg: "
  1959. for _, f := range calculateResp.Fail {
  1960. tips += fmt.Sprintf("code: %s, err: %s\n", f.EdbCode, f.ErrMsg)
  1961. }
  1962. fmt.Println(tips)
  1963. utils.FileLog.Info(tips)
  1964. go alarm_msg.SendAlarmMsg(tips, 2)
  1965. }*/
  1966. }()
  1967. edbInfoMappingList, e := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbArr)
  1968. if e != nil {
  1969. err = fmt.Errorf("获取区间计算图表, A指标mapping信息失败, Err:%v", e)
  1970. return
  1971. }
  1972. _, _, _, err = GetChartDataByEdbInfoList(0, 0, 0, "", "", edbInfoMappingList, &extraConf)
  1973. if err != nil {
  1974. err = fmt.Errorf("获取图表数据失败, ErrMsg: %v", err)
  1975. return
  1976. }
  1977. // 重新计算-先清除原数据
  1978. calculateDataOb := new(data_manage.FactorEdbSeriesCalculateDataQjjs)
  1979. cond := fmt.Sprintf("%s = ?", calculateDataOb.Cols().FactorEdbSeriesId)
  1980. pars := make([]interface{}, 0)
  1981. pars = append(pars, seriesId)
  1982. if e := calculateDataOb.RemoveByCondition(cond, pars); e != nil {
  1983. err = fmt.Errorf("清除原数据失败, err: %v", e)
  1984. return
  1985. }
  1986. // 计算成功的保存结果
  1987. dataArr := make([]*data_manage.FactorEdbSeriesCalculateDataQjjs, 0)
  1988. for _, v := range edbInfoMappingList {
  1989. dataList := v.DataList.([]*data_manage.EdbDataList)
  1990. for _, dataItem := range dataList {
  1991. dataTime, _ := time.ParseInLocation(utils.FormatDate, dataItem.DataTime, time.Local)
  1992. dataArr = append(dataArr, &data_manage.FactorEdbSeriesCalculateDataQjjs{
  1993. FactorEdbSeriesId: seriesId,
  1994. EdbInfoId: v.EdbInfoId,
  1995. EdbCode: v.EdbCode,
  1996. DataTime: dataTime,
  1997. Value: dataItem.Value,
  1998. CreateTime: time.Now().Local(),
  1999. ModifyTime: time.Now().Local(),
  2000. DataTimestamp: dataItem.DataTimestamp,
  2001. })
  2002. }
  2003. }
  2004. if len(dataArr) == 0 {
  2005. err = fmt.Errorf("计算结果无数据, seriesId: %d", seriesId)
  2006. return
  2007. }
  2008. if e = calculateDataOb.CreateMulti(dataArr); e != nil {
  2009. err = fmt.Errorf("保存计算结果失败, seriesId: %d, err: %v, ", seriesId, e)
  2010. return
  2011. }
  2012. return
  2013. }
  2014. func CheckChartRangeExtraConfig(extraConfig data_manage.ChartRangeAnalysisExtraConf) (err error, errMsg string, isSendEmail bool) {
  2015. extraConfig.SeriesName = strings.TrimSpace(extraConfig.SeriesName)
  2016. if extraConfig.SeriesName == "" && extraConfig.EdbInfoMode == 1 {
  2017. errMsg = "请输入指标系列名称"
  2018. err = errors.New(errMsg)
  2019. isSendEmail = false
  2020. return
  2021. }
  2022. if extraConfig.CalculateType > 5 || extraConfig.CalculateType < 0 {
  2023. errMsg = "计算方式参数错误"
  2024. err = errors.New(errMsg)
  2025. isSendEmail = false
  2026. return
  2027. }
  2028. switch extraConfig.DateRangeType {
  2029. case 0:
  2030. case 1:
  2031. if len(extraConfig.ManualDateConf) == 0 {
  2032. errMsg = "请选择时间区间"
  2033. err = errors.New(errMsg)
  2034. return
  2035. }
  2036. // 先按开始时间排序
  2037. sort.Sort(data_manage.ChartRangeAnalysisManualDateConfList(extraConfig.ManualDateConf))
  2038. // 校验日期
  2039. // 1.如果截止时间小于指标的截止日期,需要重置为指标的截止日期
  2040. // 2.时间区间不能重叠
  2041. for i := 1; i < len(extraConfig.ManualDateConf); i++ {
  2042. start1, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i-1].EndDate)
  2043. if e != nil {
  2044. err = e
  2045. errMsg = "截止日期格式有误"
  2046. return
  2047. }
  2048. start2, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].EndDate)
  2049. if e != nil {
  2050. err = e
  2051. errMsg = "截止日期格式有误"
  2052. return
  2053. }
  2054. start3, e := time.Parse(utils.FormatDate, extraConfig.ManualDateConf[i].StartDate)
  2055. if e != nil {
  2056. err = e
  2057. errMsg = "截止日期格式有误"
  2058. return
  2059. }
  2060. // 如果当前区间的开始时间小于等于前一个区间的结束时间,则存在重叠
  2061. if !start2.After(start1) || start3.Before(start1) {
  2062. errMsg = "日期区间存在重叠"
  2063. return
  2064. }
  2065. }
  2066. //如果截止时间大于指标的截止日期,需要重置为指标的截止日期
  2067. case 2:
  2068. if extraConfig.YearDateConf.StartDay == "" || extraConfig.YearDateConf.EndDay == "" {
  2069. errMsg = "请选择时间区间"
  2070. return
  2071. }
  2072. if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.StartDay); e != nil {
  2073. errMsg = "开始日期格式有误"
  2074. return
  2075. }
  2076. if _, e := time.Parse(utils.FormatMonthDay, extraConfig.YearDateConf.EndDay); e != nil {
  2077. errMsg = "结束日期格式有误"
  2078. return
  2079. }
  2080. }
  2081. return
  2082. }