base_from_eia_steo.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package models
  2. import (
  3. "eta/eta_crawler/utils"
  4. "github.com/beego/beego/v2/client/orm"
  5. "github.com/shopspring/decimal"
  6. "time"
  7. )
  8. // BaseFromEiaSteoIndex EiaSteo指标
  9. type BaseFromEiaSteoIndex struct {
  10. BaseFromEiaSteoIndexId int `orm:"column(base_from_eia_steo_index_id);pk"`
  11. BaseFromEiaSteoClassifyId int `description:"指标分类id"`
  12. IndexCode string `description:"指标编码"`
  13. IndexName string `description:"指标名称(中文名称)"`
  14. IndexNameOriginal string `description:"指标名称(原始名称)"`
  15. Frequency string `description:"频度"`
  16. Level int `description:"指标层级(原始层级)"`
  17. Unit string `description:"单位"`
  18. Super string `description:"我也不知道是个啥,反正先存起来,万一用到了呢"`
  19. Precision int `description:"精度,我也不知道会不会用到,反正先存起来,万一用到了呢"`
  20. LastHistorical string `description:"最近的历史记录,我也不知道会不会用到,反正先存起来,万一用到了呢"`
  21. Description string `description:"备注信息,我也不知道会不会用到,反正先存起来,万一用到了呢"`
  22. IsMappable int `description:"是否可映射,我也不知道会不会用到,反正先存起来,万一用到了呢"`
  23. StartDate time.Time `description:"开始日期"`
  24. EndDate time.Time `description:"结束日期"`
  25. ModifyTime time.Time `description:"最新更新时间"`
  26. CreateTime time.Time `description:"创建时间"`
  27. }
  28. // Add 新增指标
  29. func (item *BaseFromEiaSteoIndex) Add() (err error) {
  30. o := orm.NewOrmUsingDB("data")
  31. lastId, err := o.Insert(item)
  32. if err != nil {
  33. return
  34. }
  35. item.BaseFromEiaSteoIndexId = int(lastId)
  36. return
  37. }
  38. // Update 更新作者基础信息
  39. func (item *BaseFromEiaSteoIndex) Update(cols []string) (err error) {
  40. o := orm.NewOrmUsingDB("data")
  41. _, err = o.Update(item, cols...)
  42. return
  43. }
  44. // BaseFromEiaSteoClassify EiaSteo分类
  45. type BaseFromEiaSteoClassify struct {
  46. BaseFromEiaSteoClassifyId int `orm:"column(base_from_eia_steo_classify_id);pk"`
  47. ClassifyName string `description:"分类名称(中文名称)"`
  48. ClassifyNameOriginal string `description:"分类名称(原始名称)"`
  49. ModifyTime time.Time `description:"最新更新时间"`
  50. CreateTime time.Time `description:"创建时间"`
  51. }
  52. // 新增分类
  53. func (item *BaseFromEiaSteoClassify) AddBaseFromEiaSteoClassify() (err error) {
  54. o := orm.NewOrmUsingDB("data")
  55. lastId, err := o.Insert(item)
  56. if err != nil {
  57. return
  58. }
  59. item.BaseFromEiaSteoClassifyId = int(lastId)
  60. return
  61. }
  62. // BaseFromEiaSteoData EiaSteo数据表
  63. type BaseFromEiaSteoData struct {
  64. BaseFromEiaSteoDataId int `orm:"column(base_from_eia_steo_data_id);pk"`
  65. BaseFromEiaSteoIndexId int `description:"指标id"`
  66. IndexCode string `description:"指标编码"`
  67. DataTime time.Time `description:"数据日期"`
  68. Value float64 `description:"数据值"`
  69. ModifyTime time.Time `description:"最新更新时间"`
  70. CreateTime time.Time `description:"创建时间"`
  71. }
  72. // GetBaseFromEiaSteoClassifyAll 获取所有的分类
  73. func GetBaseFromEiaSteoClassifyAll() (list []*BaseFromEiaSteoClassify, err error) {
  74. o := orm.NewOrmUsingDB("data")
  75. sql := `SELECT * FROM base_from_eia_steo_classify`
  76. _, err = o.Raw(sql).QueryRows(&list)
  77. return
  78. }
  79. // GetBaseFromEiaSteoIndexAll 获取所有的指标
  80. func GetBaseFromEiaSteoIndexAll() (list []*BaseFromEiaSteoIndex, err error) {
  81. o := orm.NewOrmUsingDB("data")
  82. sql := `SELECT * FROM base_from_eia_steo_index`
  83. _, err = o.Raw(sql).QueryRows(&list)
  84. return
  85. }
  86. // HandleEiaSteoData 数据处理
  87. func HandleEiaSteoData(dataList map[string]interface{}, indexInfo *BaseFromEiaSteoIndex) (err error) {
  88. o := orm.NewOrmUsingDB("data")
  89. to, err := o.Begin()
  90. if err != nil {
  91. return
  92. }
  93. defer func() {
  94. if err != nil {
  95. to.Rollback()
  96. } else {
  97. to.Commit()
  98. }
  99. }()
  100. var existList []*BaseFromEiaSteoData
  101. sql := `SELECT * FROM base_from_eia_steo_data WHERE index_code = ? order by data_time asc`
  102. _, err = to.Raw(sql, indexInfo.IndexCode).QueryRows(&existList)
  103. if err != nil {
  104. return err
  105. }
  106. existMap := make(map[string]*BaseFromEiaSteoData)
  107. for _, v := range existList {
  108. existMap[v.DataTime.Format(utils.FormatDate)] = v
  109. }
  110. // 待添加的数据列表
  111. addBaseFromEiaSteoDataList := make([]*BaseFromEiaSteoData, 0)
  112. endDate := indexInfo.EndDate
  113. startDate := indexInfo.StartDate
  114. for date, v := range dataList {
  115. // 实际数据
  116. val := v.(float64)
  117. valDecimal := decimal.NewFromFloat(val).Round(4)
  118. val, _ = valDecimal.Float64()
  119. currDate, tmpErr := time.ParseInLocation(utils.FormatMonthDateUnSpace, date, time.Local)
  120. if tmpErr != nil {
  121. err = tmpErr
  122. return
  123. }
  124. if currDate.After(endDate) {
  125. endDate = currDate
  126. }
  127. if currDate.Before(startDate) {
  128. startDate = currDate
  129. }
  130. date = currDate.Format(utils.FormatDate)
  131. //fmt.Println("date:", date)
  132. tmpBaseFromEiaSteoData, ok := existMap[date]
  133. if !ok {
  134. addBaseFromEiaSteoDataList = append(addBaseFromEiaSteoDataList, &BaseFromEiaSteoData{
  135. //BaseFromEiaSteoDataId: 0,
  136. BaseFromEiaSteoIndexId: indexInfo.BaseFromEiaSteoIndexId,
  137. IndexCode: indexInfo.IndexCode,
  138. DataTime: currDate,
  139. Value: val,
  140. ModifyTime: time.Now(),
  141. CreateTime: time.Now(),
  142. })
  143. } else {
  144. nowVal := decimal.NewFromFloat(tmpBaseFromEiaSteoData.Value)
  145. //fmt.Println(date, "=========", nowVal.Equal(valDecimal))
  146. if !nowVal.Equal(valDecimal) {
  147. tmpBaseFromEiaSteoData.Value = val
  148. tmpBaseFromEiaSteoData.ModifyTime = time.Now()
  149. _, err = to.Update(tmpBaseFromEiaSteoData, "Value", "ModifyTime")
  150. if err != nil {
  151. return
  152. }
  153. }
  154. }
  155. delete(existMap, date)
  156. }
  157. lenAddBaseFromEiaSteoDataList := len(addBaseFromEiaSteoDataList)
  158. if lenAddBaseFromEiaSteoDataList > 0 {
  159. _, err = to.InsertMulti(lenAddBaseFromEiaSteoDataList, addBaseFromEiaSteoDataList)
  160. }
  161. existMapNum := len(existMap)
  162. if existMapNum > 0 {
  163. idList := make([]int, 0)
  164. for _, v := range existMap {
  165. idList = append(idList, v.BaseFromEiaSteoDataId)
  166. }
  167. sql = `DELETE FROM base_from_eia_steo_data WHERE base_from_eia_steo_data_id in(` + utils.GetOrmInReplace(existMapNum) + `) `
  168. _, err = to.Raw(sql, idList).Exec()
  169. if err != nil {
  170. return err
  171. }
  172. }
  173. // 更新指标信息
  174. {
  175. updateParams := make([]string, 0)
  176. indexInfo.ModifyTime = time.Now()
  177. updateParams = append(updateParams, "ModifyTime")
  178. if endDate.After(indexInfo.EndDate) {
  179. indexInfo.EndDate = endDate
  180. updateParams = append(updateParams, "EndDate")
  181. }
  182. if startDate.Before(indexInfo.StartDate) {
  183. indexInfo.StartDate = startDate
  184. updateParams = append(updateParams, "StartDate")
  185. }
  186. _, err = to.Update(indexInfo, updateParams...)
  187. if err != nil {
  188. return
  189. }
  190. }
  191. return
  192. }