edb_data_calculate.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/yidane/formula"
  6. "hongze/hongze_chart_lib/utils"
  7. "github.com/rdlucklib/rdluck_tools/orm"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. type EdbDataCalculate struct {
  13. EdbDataId int `orm:"column(edb_data_id);pk"`
  14. EdbInfoId int
  15. EdbCode string
  16. DataTime string
  17. Value float64
  18. Status int
  19. CreateTime time.Time
  20. ModifyTime time.Time
  21. DataTimestamp int64
  22. }
  23. func AddEdbDataCalculate(items []*EdbDataCalculate) (err error) {
  24. o := orm.NewOrm()
  25. o.Using("data")
  26. _, err = o.InsertMulti(1, items)
  27. return
  28. }
  29. func AddEdbDataCalculateBySql(sqlStr string) (err error) {
  30. o := orm.NewOrm()
  31. o.Using("data")
  32. _, err = o.Raw(sqlStr).Exec()
  33. return
  34. }
  35. func ModifyEdbDataCalculate(edbInfoId int64, dataTime string, value float64) (err error) {
  36. o := orm.NewOrm()
  37. o.Using("data")
  38. sql := ` UPDATE edb_data_calculate SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  39. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  40. return
  41. }
  42. func GetEdbDataCalculateByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  43. o := orm.NewOrm()
  44. o.Using("data")
  45. sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate WHERE edb_code=? AND data_time=? `
  46. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  47. return
  48. }
  49. //刷新全部数据
  50. func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
  51. o := orm.NewOrm()
  52. o.Using("data")
  53. o.Begin()
  54. defer func() {
  55. if err != nil {
  56. o.Rollback()
  57. } else {
  58. o.Commit()
  59. }
  60. }()
  61. fmt.Println(startDate, endDate)
  62. saveDataMap := make(map[string]map[int]float64)
  63. for _, v := range edbInfoIdArr {
  64. var condition string
  65. var pars []interface{}
  66. condition += " AND edb_info_id=? "
  67. pars = append(pars, v.EdbInfoId)
  68. if startDate != "" {
  69. condition += " AND data_time>=? "
  70. pars = append(pars, startDate)
  71. }
  72. if endDate != "" {
  73. condition += " AND data_time<=? "
  74. pars = append(pars, endDate)
  75. }
  76. fmt.Println("v.Source:", v.Source)
  77. dataList, err := GetEdbDataListAll(condition, pars, v.Source, 1)
  78. if err != nil {
  79. return err
  80. }
  81. dataMap := make(map[string]float64)
  82. for _, dv := range dataList {
  83. if val, ok := saveDataMap[dv.DataTime]; ok {
  84. if _, ok := val[v.EdbInfoId]; !ok {
  85. val[v.EdbInfoId] = dv.Value
  86. }
  87. } else {
  88. temp := make(map[int]float64)
  89. temp[v.EdbInfoId] = dv.Value
  90. saveDataMap[dv.DataTime] = temp
  91. }
  92. }
  93. item := new(CalculateItems)
  94. item.EdbInfoId = v.EdbInfoId
  95. item.DataMap = dataMap
  96. }
  97. formulaMap := CheckFormula(formulaStr)
  98. addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  99. var isAdd bool
  100. //获取指标所有数据
  101. dataList := make([]*EdbDataBase, 0)
  102. dataTableName := GetEdbDataTableName(source)
  103. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  104. sql = fmt.Sprintf(sql, dataTableName)
  105. _, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
  106. if err != nil {
  107. return err
  108. }
  109. dataMap := make(map[string]string)
  110. for _, v := range dataList {
  111. dataMap[v.DataTime] = v.Value
  112. }
  113. edbInfoIdStr := strconv.Itoa(edbInfoId)
  114. existDataMap := make(map[string]string)
  115. for sk, sv := range saveDataMap {
  116. fmt.Println(sk, sv)
  117. formulaStr = strings.ToUpper(formulaStr)
  118. formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
  119. if formulaFormStr != "" {
  120. utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
  121. expression := formula.NewExpression(formulaFormStr)
  122. calResult, err := expression.Evaluate()
  123. if err != nil {
  124. err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  125. fmt.Println(err)
  126. return err
  127. }
  128. calVal, err := calResult.Float64()
  129. if err != nil {
  130. err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  131. fmt.Println(err)
  132. return err
  133. }
  134. saveValue := utils.SubFloatToString(calVal, 4)
  135. if existVal, ok := dataMap[sk]; !ok {
  136. dataTime, _ := time.Parse(utils.FormatDate, sk)
  137. timestamp := dataTime.UnixNano() / 1e6
  138. timeStr := fmt.Sprintf("%d", timestamp)
  139. if _, existOk := existDataMap[sk]; !existOk {
  140. addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
  141. isAdd = true
  142. }
  143. existDataMap[sk] = sk
  144. } else {
  145. if existVal != saveValue {
  146. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  147. sql = fmt.Sprintf(sql, dataTableName)
  148. _, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
  149. if err != nil {
  150. return err
  151. }
  152. }
  153. }
  154. }
  155. }
  156. if isAdd {
  157. addSql = strings.TrimRight(addSql, ",")
  158. _, err = o.Raw(addSql).Exec()
  159. if err != nil {
  160. fmt.Println("RefreshAllCalculate add Err", err.Error())
  161. return
  162. }
  163. }
  164. return
  165. }