factor_edb_series.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package services
  2. import (
  3. "eta/eta_index_lib/models"
  4. "eta/eta_index_lib/services/alarm_msg"
  5. "eta/eta_index_lib/utils"
  6. "fmt"
  7. "time"
  8. )
  9. // FactorEdbStepCalculate 因子指标-多公式计算
  10. func FactorEdbStepCalculate(seriesId, edbInfoId int, edbCode string, edbData []*models.EdbInfoSearchData, calculates []models.CalculatesReq) (err error) {
  11. if len(edbData) == 0 || len(calculates) == 0 {
  12. return
  13. }
  14. defer func() {
  15. if err != nil {
  16. tips := fmt.Sprintf("FactorEdbStepCalculate计算失败, EdbCode: %s, ErrMsg: %v", edbCode, err)
  17. utils.FileLog.Info(tips)
  18. go alarm_msg.SendAlarmMsg(tips, 2)
  19. }
  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. // 多公式嵌套计算
  33. dataMap, dateList, _, e := StepCalculate(edbData, calculates)
  34. if e != nil {
  35. err = fmt.Errorf("嵌套计算失败, err: %v", e)
  36. return
  37. }
  38. // 计算成功的保存结果
  39. dataArr := make([]*models.FactorEdbSeriesCalculateData, 0)
  40. for _, d := range dateList {
  41. val, ok := dataMap[d]
  42. if !ok {
  43. continue
  44. }
  45. dataTime, e := time.ParseInLocation(utils.FormatDate, d, time.Local)
  46. if e != nil {
  47. err = fmt.Errorf("解析计算结果日期失败, err: %v", e)
  48. return
  49. }
  50. dataArr = append(dataArr, &models.FactorEdbSeriesCalculateData{
  51. FactorEdbSeriesId: seriesId,
  52. EdbInfoId: edbInfoId,
  53. EdbCode: edbCode,
  54. DataTime: dataTime,
  55. Value: val,
  56. CreateTime: time.Now().Local(),
  57. ModifyTime: time.Now().Local(),
  58. DataTimestamp: dataTime.UnixNano() / 1e6,
  59. })
  60. }
  61. if len(dataArr) == 0 {
  62. //err = fmt.Errorf("计算结果无数据")
  63. return
  64. }
  65. if e = calculateDataOb.CreateMulti(dataArr); e != nil {
  66. err = fmt.Errorf("保存计算结果失败, err: %v", e)
  67. return
  68. }
  69. return
  70. }