chart_info.go 68 KB

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