edb_data_insert_config.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package data_manage
  2. import (
  3. "errors"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "github.com/beego/beego/v2/client/orm"
  7. "time"
  8. )
  9. // EdbDataInsertConfig 指标数据插入配置表
  10. type EdbDataInsertConfig struct {
  11. EdbInfoId int `orm:"column(edb_info_id);pk" description:"指标id"`
  12. Date time.Time `description:"插入的日期"`
  13. Value string `description:"插入的值"`
  14. RealDate time.Time `description:"实际数据的值日期"`
  15. ModifyTime time.Time `description:"数据更新时间"`
  16. CreateTime time.Time `description:"数据插入的时间"`
  17. }
  18. // GetEdbDataInsertConfigByEdbId 根据指标id 获取数据插入配置详情
  19. func GetEdbDataInsertConfigByEdbId(edbInfoId int) (item *EdbDataInsertConfig, err error) {
  20. o := orm.NewOrmUsingDB("data")
  21. sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? `
  22. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  23. return
  24. }
  25. // GetEdbDataInsertConfigByEdbIdList 根据指标id列表 获取数据插入配置详情
  26. func GetEdbDataInsertConfigByEdbIdList(edbInfoIdList []int) (items []*EdbDataInsertConfig, err error) {
  27. num := len(edbInfoIdList)
  28. if num <= 0 {
  29. return
  30. }
  31. o := orm.NewOrmUsingDB("data")
  32. sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
  33. _, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
  34. return
  35. }
  36. // CreateEdbDataInsertConfigAndData 创建数据插入配置规则,及插入数据
  37. func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) {
  38. isSendEmail = true
  39. tableName := GetEdbDataTableName(edbInfo.Source)
  40. if tableName == `` {
  41. err = errors.New("找不到该指标的数据表")
  42. return
  43. }
  44. dateStr := date.Format(utils.FormatDate)
  45. timestamp := date.UnixNano() / 1e6
  46. timeStr := fmt.Sprintf("%d", timestamp)
  47. saveValue := utils.SubFloatToString(value, 30)
  48. to, err := orm.NewOrmUsingDB("data").Begin()
  49. if err != nil {
  50. return
  51. }
  52. defer func() {
  53. if err != nil {
  54. _ = to.Rollback()
  55. } else {
  56. _ = to.Commit()
  57. }
  58. }()
  59. var oldConfigDate time.Time //之前配置的日期
  60. // 添加/变更配置
  61. {
  62. var item *EdbDataInsertConfig
  63. sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? `
  64. err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&item)
  65. if err != nil && err.Error() != utils.ErrNoRow() {
  66. return
  67. }
  68. err = nil
  69. // 如果是没有配置,那么就需要添加配置
  70. if item == nil {
  71. var currLatestDate time.Time
  72. currLatestDateStr := edbInfo.LatestDate // 实际日期
  73. if currLatestDateStr != `` && currLatestDateStr != `0000-00-00` {
  74. currLatestDate, _ = time.ParseInLocation(utils.FormatDate, currLatestDateStr, time.Local)
  75. }
  76. if !currLatestDate.IsZero() && (currLatestDate.After(date) || currLatestDate.Equal(date)) {
  77. errMsg = `选择日期不能早于/等于数据最新日期`
  78. err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
  79. isSendEmail = false
  80. return
  81. }
  82. realDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
  83. item = &EdbDataInsertConfig{
  84. EdbInfoId: edbInfo.EdbInfoId,
  85. Date: date,
  86. Value: saveValue,
  87. RealDate: realDate,
  88. ModifyTime: time.Now(),
  89. CreateTime: time.Now(),
  90. }
  91. _, err = to.Insert(item)
  92. } else {
  93. if date.Equal(item.RealDate) || date.Before(item.RealDate) {
  94. errMsg = `选择日期不能早于/等于数据最新日期`
  95. err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
  96. isSendEmail = false
  97. return
  98. }
  99. oldConfigDate = item.Date // 之前配置的日期
  100. item.Date = date
  101. item.Value = saveValue
  102. item.ModifyTime = time.Now()
  103. _, err = to.Update(item, "Date", "Value", "ModifyTime")
  104. }
  105. if err != nil {
  106. return
  107. }
  108. }
  109. // 更改数据
  110. {
  111. var edbDateData *EdbDataList
  112. if !oldConfigDate.IsZero() {
  113. sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? AND data_time = ?`
  114. sql = fmt.Sprintf(sql, tableName)
  115. err = to.Raw(sql, edbInfo.EdbInfoId, oldConfigDate.Format(utils.FormatDate)).QueryRow(&edbDateData)
  116. if err != nil && err.Error() != utils.ErrNoRow() {
  117. return
  118. }
  119. err = nil
  120. }
  121. // 如果是没有历史数据,那么就需要增加数据
  122. if edbDateData == nil {
  123. addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, "%s", "%s", "%s", now(), now(), %s) `
  124. addSql = fmt.Sprintf(addSql, tableName, edbInfo.EdbInfoId, edbInfo.EdbCode, dateStr, saveValue, timeStr)
  125. _, err = to.Raw(addSql).Exec()
  126. } else {
  127. updateSql := `UPDATE %s SET data_time = "%s", value = "%s", modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;`
  128. updateSql = fmt.Sprintf(updateSql, tableName, dateStr, saveValue, timeStr, edbDateData.EdbDataId)
  129. _, err = to.Raw(updateSql).Exec()
  130. }
  131. if err != nil {
  132. return
  133. }
  134. }
  135. // 更改指标的数据结束日期
  136. edbInfo.EndDate = dateStr
  137. _, err = to.Update(edbInfo, "EndDate")
  138. return
  139. }