chart_info.go 51 KB

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