chart_info.go 55 KB

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