base_from_rzd_data.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // @Author gmy 2024/10/21 9:50:00
  2. package models
  3. import (
  4. "eta/eta_index_lib/global"
  5. "eta/eta_index_lib/utils"
  6. "github.com/shopspring/decimal"
  7. "gorm.io/gorm"
  8. "gorm.io/gorm/clause"
  9. "time"
  10. )
  11. type BaseFromRzdData struct {
  12. BaseFromRzdDataId int `gorm:"column:base_from_rzd_data_id;primaryKey"`
  13. BaseFromRzdIndexId int `gorm:"column:base_from_rzd_index_id"`
  14. CreateTime string `gorm:"column:create_time"`
  15. DataTime string `gorm:"column:data_time"`
  16. IndexCode string `gorm:"column:index_code"`
  17. ModifyTime string `gorm:"column:modify_time"`
  18. Value float64 `gorm:"column:value"`
  19. }
  20. type IndexInfo struct {
  21. IndexName string
  22. IndexCode string
  23. Frequency string
  24. Unit string
  25. ClassifyId int
  26. StartDate time.Time
  27. EndDate time.Time
  28. LatestValue decimal.Decimal
  29. DataList []IndexData
  30. }
  31. type IndexData struct {
  32. DataTime time.Time
  33. Value decimal.Decimal
  34. }
  35. // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
  36. func (m *BaseFromRzdData) AfterFind(db *gorm.DB) (err error) {
  37. m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
  38. m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
  39. m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
  40. return
  41. }
  42. func (m *BaseFromRzdData) ConvDateTimeStr() {
  43. m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
  44. m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
  45. m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
  46. return
  47. }
  48. // AddRzdDataList 批量插入数据记录列表
  49. func AddRzdDataList(items []BaseFromRzdData) (err error) {
  50. //o := orm.NewOrm()
  51. //_, err = o.InsertMulti(len(items), items)
  52. err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
  53. return
  54. }
  55. func UpdateIndexAndAddRzdDataList(index *BaseFromRzdIndex, items []*BaseFromRzdData) (err error) {
  56. tx := global.DEFAULT_DB.Begin()
  57. defer func() {
  58. if err != nil {
  59. tx.Rollback()
  60. } else {
  61. tx.Commit()
  62. }
  63. }()
  64. err = tx.Model(index).Select([]string{"latest_value", "start_date", "end_date", "base_from_rzd_classify_id"}).Updates(&index).Error
  65. if err != nil {
  66. return
  67. }
  68. err = tx.Clauses(
  69. clause.OnConflict{
  70. Columns: []clause.Column{{Name: "base_from_rzd_index_id"}, {Name: "data_time"}},
  71. DoUpdates: clause.AssignmentColumns([]string{"value"})}).CreateInBatches(items, len(items)).Error
  72. return
  73. }
  74. // GetRzdDataByIndexCodeAndDataTime 根据指标id和数据日期查询数据
  75. func GetRzdDataByIndexCodeAndDataTime(indexCode string, dataTime string) (item BaseFromRzdData, err error) {
  76. //o := orm.NewOrm()
  77. sql := `SELECT * FROM base_from_rzd_data WHERE index_code=? AND data_time=?`
  78. //err = o.Raw(sql, indexCode, dataTime).QueryRow(&items) // 使用 QueryRow
  79. err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
  80. if utils.IsErrNoRow(err) {
  81. return item, nil
  82. }
  83. if err != nil {
  84. return item, err
  85. }
  86. item.ConvDateTimeStr()
  87. return
  88. }
  89. // UpdateRzdDataById 根据主键id更新数据
  90. func UpdateRzdDataById(dataId int, value float64) (err error) {
  91. //o := orm.NewOrm()
  92. sql := `UPDATE base_from_rzd_data SET value=? WHERE base_from_rzd_data_id=?`
  93. //_, err = o.Raw(sql, value, dataId).Exec()
  94. err = global.DEFAULT_DB.Exec(sql, value, dataId).Error
  95. return
  96. }
  97. // GetBaseFromRzdDataByCondition 添加查询
  98. func GetBaseFromRzdDataByCondition(condition string, pars []interface{}) (items []BaseFromRzdData, err error) {
  99. sql := `SELECT * FROM base_from_rzd_data WHERE 1=1 `
  100. //o := orm.NewOrm()
  101. if condition != "" {
  102. sql += condition
  103. }
  104. //_, err = o.Raw(sql, pars...).QueryRows(&items)
  105. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  106. if utils.IsErrNoRow(err) {
  107. return nil, nil
  108. }
  109. return
  110. }
  111. // UpdateRzdData 修改睿姿得数据
  112. func UpdateRzdData(item *BaseFromRzdData) (err error) {
  113. //o := orm.NewOrm()
  114. //_, err = o.Update(item)
  115. err = global.DEFAULT_DB.Save(&item).Error
  116. return
  117. }
  118. // GetRzdDataMaxAndMinDateByIndexCodes 查询数据时间最新值,数据时间最小值和最新值对应的value值
  119. func GetRzdDataMaxAndMinDateByIndexCodes(indexCodes []string) (resultMap map[string]*EdbInfoMaxAndMinInfo, err error) {
  120. resultMap = make(map[string]*EdbInfoMaxAndMinInfo)
  121. //o := orm.NewOrm()
  122. sql := ` SELECT index_code, MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_rzd_data WHERE index_code in (` + utils.GetOrmInReplace(len(indexCodes)) + `) GROUP BY index_code`
  123. var items []EdbInfoMaxAndMinInfo
  124. //_, err = o.Raw(sql, indexCodes).QueryRows(&items)
  125. err = global.DEFAULT_DB.Raw(sql, indexCodes).Find(&items).Error
  126. if err != nil {
  127. return nil, err
  128. }
  129. for _, row := range items {
  130. resultMap[row.IndexCode] = &EdbInfoMaxAndMinInfo{
  131. MinDate: row.MinDate,
  132. MaxDate: row.MaxDate,
  133. MinValue: row.MinValue,
  134. MaxValue: row.MaxValue,
  135. }
  136. }
  137. // 查询最新的值(最新数据时间对应的 value)
  138. sql = `SELECT a.index_code, a.value AS latest_value
  139. FROM base_from_rzd_data a
  140. JOIN (
  141. SELECT index_code, MAX(data_time) AS latest_time
  142. FROM base_from_rzd_data
  143. WHERE index_code IN (` + utils.GetOrmInReplace(len(indexCodes)) + `)
  144. GROUP BY index_code
  145. ) b ON a.index_code = b.index_code AND a.data_time = b.latest_time`
  146. //_, err = o.Raw(sql, indexCodes).QueryRows(&items)
  147. err = global.DEFAULT_DB.Raw(sql, indexCodes).Find(&items).Error
  148. if err != nil {
  149. return nil, err
  150. }
  151. for _, row := range items {
  152. if _, ok := resultMap[row.IndexCode]; ok {
  153. resultMap[row.IndexCode].LatestValue = row.LatestValue
  154. }
  155. }
  156. return resultMap, nil
  157. }
  158. func UpdateRzdEdbDataByIndexCodes(indexCode string, info *EdbInfoMaxAndMinInfo) error {
  159. //o := orm.NewOrm()
  160. sql := `UPDATE base_from_rzd_index SET start_date=?, end_date=?, latest_value=? WHERE index_code=?`
  161. //_, err := o.Raw(sql, info.MinDate, info.MaxDate, info.LatestValue, indexCode).Exec()
  162. err := global.DEFAULT_DB.Exec(sql, info.MinDate, info.MaxDate, info.LatestValue, indexCode).Error
  163. return err
  164. }