chart_info.go 60 KB

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