data_calculate.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package data
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_task/models/data_manage"
  6. "hongze/hongze_task/utils"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/yidane/formula"
  11. )
  12. //指标运算刷新数据
  13. func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
  14. defer func() {
  15. if err != nil {
  16. utils.FileLog.Info("Calculate Err:%s" + err.Error())
  17. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshCalculate ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  18. }
  19. }()
  20. saveDataMap := make(map[string]map[int]float64)
  21. for _, v := range edbInfoIdArr {
  22. var condition string
  23. var pars []interface{}
  24. condition += " AND edb_info_id=? "
  25. pars = append(pars, v.EdbInfoId)
  26. if startDate != "" {
  27. condition += " AND data_time>=? "
  28. pars = append(pars, startDate)
  29. }
  30. if endDate != "" {
  31. condition += " AND data_time<=? "
  32. pars = append(pars, endDate)
  33. }
  34. dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
  35. if err != nil {
  36. return err
  37. }
  38. dataMap := make(map[string]float64)
  39. for _, dv := range dataList {
  40. if val, ok := saveDataMap[dv.DataTime]; ok {
  41. if _, ok := val[v.EdbInfoId]; !ok {
  42. val[v.EdbInfoId] = dv.Value
  43. }
  44. } else {
  45. temp := make(map[int]float64)
  46. temp[v.EdbInfoId] = dv.Value
  47. saveDataMap[dv.DataTime] = temp
  48. }
  49. }
  50. item := new(CalculateItems)
  51. item.EdbInfoId = v.EdbInfoId
  52. item.DataMap = dataMap
  53. }
  54. formulaMap := CheckFormula(formulaStr)
  55. addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  56. nowStr := time.Now().Format(utils.FormatDateTime)
  57. var isAdd bool
  58. for sk, sv := range saveDataMap {
  59. formulaStr = strings.ToUpper(formulaStr)
  60. formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
  61. //if formulaFormStr != "" && !strings.Contains(formulaFormStr, "/0") {
  62. if formulaFormStr != "" {
  63. expression := formula.NewExpression(formulaFormStr)
  64. calResult, err := expression.Evaluate()
  65. if err != nil {
  66. err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  67. fmt.Println(err)
  68. return err
  69. }
  70. calVal, err := calResult.Float64()
  71. if err != nil {
  72. err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  73. fmt.Println(err)
  74. return err
  75. }
  76. count, err := data_manage.GetEdbDataCalculateByCodeAndDate(edbCode, sk)
  77. if err != nil && err.Error() != utils.ErrNoRow() {
  78. return err
  79. }
  80. if count <= 0 { //需要存入的数据
  81. dataTime, _ := time.Parse(utils.FormatDate, sk)
  82. timestamp := dataTime.UnixNano() / 1e6
  83. timeStr := fmt.Sprintf("%d", timestamp)
  84. addSql += "("
  85. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
  86. "," + "'" + nowStr + "'" + "," + "1"
  87. addSql += "," + "'" + timeStr + "'"
  88. addSql += "),"
  89. isAdd = true
  90. } else {
  91. calVal = utils.FixFloat(calVal, 4)
  92. err = data_manage.ModifyEdbDataCalculate(int64(edbInfoId), sk, calVal)
  93. if err != nil {
  94. return err
  95. }
  96. }
  97. }
  98. }
  99. if isAdd {
  100. addSql = strings.TrimRight(addSql, ",")
  101. data_manage.AddEdbDataCalculateBySql(addSql)
  102. if err != nil {
  103. fmt.Println("AddEdbDataCalculate Err:" + err.Error())
  104. return err
  105. }
  106. }
  107. maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE, edbCode)
  108. if err != nil {
  109. return err
  110. }
  111. if maxAndMinItem != nil {
  112. err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  113. if err != nil {
  114. return err
  115. }
  116. }
  117. return
  118. }