factor_edb_series.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_index_lib/models"
  6. "eta_gn/eta_index_lib/services/alarm_msg"
  7. "eta_gn/eta_index_lib/utils"
  8. "fmt"
  9. "time"
  10. )
  11. func FactorEdbStepCalculate(seriesId, edbInfoId int, edbCode string, edbData []*models.EdbInfoSearchData, calculates []models.CalculatesReq) (err error) {
  12. if len(edbData) == 0 || len(calculates) == 0 {
  13. return
  14. }
  15. defer func() {
  16. if err != nil {
  17. tips := fmt.Sprintf("FactorEdbStepCalculate计算失败, EdbCode: %s, ErrMsg: %v", edbCode, err)
  18. utils.FileLog.Info(tips)
  19. go alarm_msg.SendAlarmMsg(tips, 2)
  20. }
  21. }()
  22. calculateDataOb := new(models.FactorEdbSeriesCalculateData)
  23. {
  24. cond := fmt.Sprintf("%s = ?", calculateDataOb.Cols().FactorEdbSeriesId)
  25. pars := make([]interface{}, 0)
  26. pars = append(pars, seriesId)
  27. if e := calculateDataOb.RemoveByCondition(cond, pars); e != nil {
  28. err = fmt.Errorf("清除原数据失败, err: %v", e)
  29. return
  30. }
  31. }
  32. dataMap, dateList, _, e := StepCalculate(edbData, calculates)
  33. if e != nil {
  34. err = fmt.Errorf("嵌套计算失败, err: %v", e)
  35. return
  36. }
  37. dataArr := make([]*models.FactorEdbSeriesCalculateData, 0)
  38. for _, d := range dateList {
  39. val, ok := dataMap[d]
  40. if !ok {
  41. continue
  42. }
  43. dataTime, e := time.ParseInLocation(utils.FormatDate, d, time.Local)
  44. if e != nil {
  45. err = fmt.Errorf("解析计算结果日期失败, err: %v", e)
  46. return
  47. }
  48. dataArr = append(dataArr, &models.FactorEdbSeriesCalculateData{
  49. FactorEdbSeriesId: seriesId,
  50. EdbInfoId: edbInfoId,
  51. EdbCode: edbCode,
  52. DataTime: dataTime,
  53. Value: val,
  54. CreateTime: time.Now().Local(),
  55. ModifyTime: time.Now().Local(),
  56. DataTimestamp: dataTime.UnixNano() / 1e6,
  57. })
  58. }
  59. if len(dataArr) == 0 {
  60. return
  61. }
  62. if e = calculateDataOb.CreateMulti(dataArr); e != nil {
  63. err = fmt.Errorf("保存计算结果失败, err: %v", e)
  64. return
  65. }
  66. return
  67. }
  68. func RangeAnalysisChartCalculate(seriesId, chartInfoId int, seriesMappingItem *models.FactorEdbSeriesChartMapping) (err error, errMsg string) {
  69. defer func() {
  70. if err != nil {
  71. tips := fmt.Sprintf("RangeAnalysisChartCalculate 区间分析图表计算失败, 图表ID:%d, ErrMsg: %v", chartInfoId, err)
  72. fmt.Println(tips)
  73. utils.FileLog.Info(tips)
  74. go alarm_msg.SendAlarmMsg(tips, 3)
  75. }
  76. }()
  77. chartInfo, err := models.GetChartInfoById(chartInfoId)
  78. if err != nil {
  79. if err.Error() == utils.ErrNoRow() {
  80. errMsg = "图表已被删除,请刷新页面"
  81. err = errors.New(errMsg)
  82. return
  83. }
  84. errMsg = "获取图表信息失败"
  85. err = errors.New("获取图表信息失败,Err:" + err.Error())
  86. return
  87. }
  88. var extraConfig models.RangeAnalysisCalculateFormula
  89. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
  90. if err != nil {
  91. errMsg = "配置信息错误"
  92. err = errors.New(errMsg + ", Err: " + err.Error())
  93. return
  94. }
  95. if seriesMappingItem.FactorEdbSeriesChartMappingId > 0 {
  96. ob := new(models.FactorEdbSeriesMapping)
  97. seriesEdbMappingList, e := ob.GetItemBySeriesId(seriesMappingItem.FactorEdbSeriesId)
  98. if e != nil { // 没有数据,则不计算
  99. return
  100. }
  101. edbInfoIds := make([]int, 0)
  102. for _, item := range seriesEdbMappingList {
  103. edbInfoIds = append(edbInfoIds, item.EdbInfoId)
  104. }
  105. edbInfoList, e := models.GetEdbInfoByIdList(edbInfoIds)
  106. if e != nil {
  107. errMsg = "获取指标信息失败"
  108. err = errors.New(errMsg + ", Err: " + e.Error())
  109. return
  110. }
  111. calculateDataOb := new(models.FactorEdbSeriesCalculateDataQjjs)
  112. cond := fmt.Sprintf("%s = ?", calculateDataOb.Cols().FactorEdbSeriesId)
  113. pars := make([]interface{}, 0)
  114. pars = append(pars, seriesId)
  115. if e := calculateDataOb.RemoveByCondition(cond, pars); e != nil {
  116. err = fmt.Errorf("清除原数据失败, err: %v", e)
  117. return
  118. }
  119. dataArr := make([]*models.FactorEdbSeriesCalculateDataQjjs, 0)
  120. for _, fromEdbInfo := range edbInfoList {
  121. dataList, e := models.GetRangeAnalysisChartDataByEdbInfo(fromEdbInfo, extraConfig)
  122. if e != nil {
  123. errMsg = "获取区间分析图表数据失败"
  124. err = errors.New(errMsg + ", Err: " + e.Error())
  125. return
  126. }
  127. for _, dataItem := range dataList {
  128. dataTime, _ := time.ParseInLocation(utils.FormatDate, dataItem.DataTime, time.Local)
  129. dataArr = append(dataArr, &models.FactorEdbSeriesCalculateDataQjjs{
  130. FactorEdbSeriesId: seriesId,
  131. EdbInfoId: fromEdbInfo.EdbInfoId,
  132. EdbCode: fromEdbInfo.EdbCode,
  133. DataTime: dataTime,
  134. Value: dataItem.Value,
  135. CreateTime: time.Now().Local(),
  136. ModifyTime: time.Now().Local(),
  137. DataTimestamp: dataItem.DataTimestamp,
  138. })
  139. }
  140. }
  141. if len(dataArr) == 0 {
  142. err = fmt.Errorf("计算结果无数据, seriesId: %d", seriesId)
  143. return
  144. }
  145. if e := calculateDataOb.CreateMulti(dataArr); e != nil {
  146. err = fmt.Errorf("保存计算结果失败, seriesId: %d, err: %v, ", seriesId, e)
  147. return
  148. }
  149. }
  150. return
  151. }