base_from_national_statistics_index.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package data_manage
  2. import (
  3. "eta/eta_api/global"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "strings"
  7. "time"
  8. )
  9. // BaseFromNationalStatisticsIndex 国统局-指标
  10. type BaseFromNationalStatisticsIndex struct {
  11. BaseFromNationalStatisticsIndexId int `orm:"column(base_from_national_statistics_index_id);pk" gorm:"primaryKey"`
  12. BaseFromNationalStatisticsClassifyId int `description:"指标分类ID"`
  13. Dbcode string `description:"dbcode"`
  14. IndexCode string `description:"指标编码"`
  15. IndexName string `description:"指标名称"`
  16. Unit string `description:"单位"`
  17. Frequency string `description:"频度"`
  18. Reg string `description:"地区"`
  19. StartDate time.Time `description:"开始日期"`
  20. EndDate time.Time `description:"结束日期"`
  21. CreateTime time.Time `description:"创建时间"`
  22. ModifyTime time.Time `description:"更新时间"`
  23. }
  24. func (m *BaseFromNationalStatisticsIndex) TableName() string {
  25. return "base_from_national_statistics_index"
  26. }
  27. func (m *BaseFromNationalStatisticsIndex) Create() (err error) {
  28. o := global.DbMap[utils.DbNameIndex]
  29. err = o.Create(m).Error
  30. return
  31. }
  32. func (m *BaseFromNationalStatisticsIndex) CreateMulti(items []*BaseFromNationalStatisticsIndex) (err error) {
  33. if len(items) == 0 {
  34. return
  35. }
  36. o := global.DbMap[utils.DbNameIndex]
  37. err = o.CreateInBatches(items, utils.MultiAddNum).Error
  38. return
  39. }
  40. func (m *BaseFromNationalStatisticsIndex) Update(cols []string) (err error) {
  41. o := global.DbMap[utils.DbNameIndex]
  42. err = o.Select(cols).Updates(m).Error
  43. return
  44. }
  45. func (m *BaseFromNationalStatisticsIndex) Del() (err error) {
  46. o := global.DbMap[utils.DbNameIndex]
  47. sql := `DELETE FROM base_from_national_statistics_index WHERE base_from_national_statistics_index_id = ? LIMIT 1`
  48. err = o.Exec(sql, m.BaseFromNationalStatisticsIndexId).Error
  49. return
  50. }
  51. func (m *BaseFromNationalStatisticsIndex) GetItemById(id int) (err error) {
  52. o := global.DbMap[utils.DbNameIndex]
  53. sql := `SELECT * FROM base_from_national_statistics_index WHERE base_from_national_statistics_index_id = ? LIMIT 1`
  54. err = o.Raw(sql, id).First(&m).Error
  55. return
  56. }
  57. func (m *BaseFromNationalStatisticsIndex) GetItemByCondition(condition string, pars []interface{}) (err error) {
  58. o := global.DbMap[utils.DbNameIndex]
  59. sql := `SELECT * FROM base_from_national_statistics_index WHERE 1=1 `
  60. sql += condition
  61. sql += ` LIMIT 1`
  62. err = o.Raw(sql, pars...).First(&m).Error
  63. return
  64. }
  65. func (m *BaseFromNationalStatisticsIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  66. o := global.DbMap[utils.DbNameIndex]
  67. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  68. err = o.Raw(sql, pars...).Scan(&count).Error
  69. return
  70. }
  71. func (m *BaseFromNationalStatisticsIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, limitNum int) (items []*BaseFromNationalStatisticsIndex, err error) {
  72. o := global.DbMap[utils.DbNameIndex]
  73. fields := strings.Join(fieldArr, ",")
  74. if len(fieldArr) == 0 {
  75. fields = `*`
  76. }
  77. order := `ORDER BY create_time DESC`
  78. if orderRule != "" {
  79. order = ` ORDER BY ` + orderRule
  80. }
  81. limit := ``
  82. if limitNum > 0 {
  83. limit += fmt.Sprintf(` LIMIT %d`, limitNum)
  84. }
  85. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s %s`, fields, m.TableName(), condition, order, limit)
  86. err = o.Raw(sql, pars...).Find(&items).Error
  87. return
  88. }
  89. // SaveNationalStatisticsIndexAndDataReq 保存指标和数据请求体
  90. type SaveNationalStatisticsIndexAndDataReq struct {
  91. Index *BaseFromNationalStatisticsIndex `description:"指标信息"`
  92. IndexExist bool `description:"指标是否存在"`
  93. DataList []*BaseFromNationalStatisticsData `description:"新增的指标数据"`
  94. }
  95. // SaveNationalStatisticsIndexAndData 保存指标和值
  96. func SaveNationalStatisticsIndexAndData(req *SaveNationalStatisticsIndexAndDataReq) (err error) {
  97. if req.Index == nil {
  98. return
  99. }
  100. o := global.DbMap[utils.DbNameIndex]
  101. tx := o.Begin()
  102. if tx.Error != nil {
  103. return tx.Error
  104. }
  105. defer func() {
  106. if err != nil {
  107. _ = tx.Rollback()
  108. return
  109. }
  110. _ = tx.Commit()
  111. }()
  112. if !req.IndexExist {
  113. err = tx.Create(req.Index).Error
  114. if err != nil {
  115. return err
  116. }
  117. req.Index.BaseFromNationalStatisticsIndexId = int(req.Index.BaseFromNationalStatisticsIndexId)
  118. }
  119. indexId := req.Index.BaseFromNationalStatisticsIndexId
  120. if req.DataList != nil && len(req.DataList) > 0 {
  121. for _, d := range req.DataList {
  122. d.BaseFromNationalStatisticsIndexId = indexId
  123. }
  124. err = tx.CreateInBatches(req.DataList, utils.MultiAddNum).Error
  125. if err != nil {
  126. return err
  127. }
  128. }
  129. return
  130. }
  131. // BatchSaveNationalStatisticsIndexAndData 批量保存指标和值
  132. func BatchSaveNationalStatisticsIndexAndData(indexArr []*BaseFromNationalStatisticsIndex, indexDataMap map[string][]*BaseFromNationalStatisticsData) (err error) {
  133. o := global.DbMap[utils.DbNameIndex]
  134. tx := o.Begin()
  135. if tx.Error != nil {
  136. return tx.Error
  137. }
  138. defer func() {
  139. if err != nil {
  140. _ = tx.Rollback()
  141. return
  142. }
  143. _ = tx.Commit()
  144. }()
  145. // 指标
  146. for _, v := range indexArr {
  147. err = tx.Create(v).Error
  148. if err != nil {
  149. return err
  150. }
  151. indexId := v.BaseFromNationalStatisticsIndexId
  152. // 数据
  153. dataList := indexDataMap[v.IndexCode]
  154. if dataList != nil && len(dataList) > 0 {
  155. for _, d := range dataList {
  156. d.BaseFromNationalStatisticsIndexId = indexId
  157. }
  158. err = tx.CreateInBatches(dataList, utils.MultiAddNum).Error
  159. if err != nil {
  160. return err
  161. }
  162. }
  163. }
  164. return
  165. }
  166. // UpdateNationalStatisticsIndexStartEndDate 更新指标开始结束日期
  167. func UpdateNationalStatisticsIndexStartEndDate() (err error) {
  168. o := global.DbMap[utils.DbNameIndex]
  169. sql := `UPDATE base_from_national_statistics_index AS a
  170. JOIN (
  171. SELECT
  172. index_code,
  173. MIN(data_time) AS min_time,
  174. MAX(data_time) AS max_time
  175. FROM
  176. base_from_national_statistics_data
  177. GROUP BY
  178. index_code
  179. ) AS b ON a.index_code = b.index_code
  180. SET a.start_date = b.min_time, a.end_date = b.max_time`
  181. err = o.Exec(sql).Error
  182. return
  183. }
  184. type BaseFromNationalStatisticsIndexItem struct {
  185. IndexId int `description:"指标ID"`
  186. ClassifyId int `description:"指标分类ID"`
  187. Dbcode string `description:"dbcode"`
  188. IndexCode string `description:"指标编码"`
  189. IndexName string `description:"指标名称"`
  190. Unit string `description:"单位"`
  191. Frequency string `description:"频度"`
  192. Reg string `description:"地区"`
  193. StartDate string `description:"开始日期"`
  194. EndDate string `description:"结束日期"`
  195. CreateTime string `description:"创建时间"`
  196. ModifyTime string `description:"更新时间"`
  197. ChildrenIndexIds []int `description:"有地区维度的指标-子指标ID集合-用于前端定位"`
  198. }
  199. type BaseFromNationalStatisticsIndexListResp struct {
  200. List []*BaseFromNationalStatisticsIndexItem `description:"指标列表"`
  201. RegList []string `description:"地区列表"`
  202. }
  203. func FormatBaseFromNationalStatisticsIndex2Item(v *BaseFromNationalStatisticsIndex) (item *BaseFromNationalStatisticsIndexItem) {
  204. item = new(BaseFromNationalStatisticsIndexItem)
  205. item.IndexId = v.BaseFromNationalStatisticsIndexId
  206. item.ClassifyId = v.BaseFromNationalStatisticsClassifyId
  207. item.Dbcode = v.Dbcode
  208. item.IndexCode = v.IndexCode
  209. item.IndexName = v.IndexName
  210. item.Unit = v.Unit
  211. item.Frequency = v.Frequency
  212. item.Reg = v.Reg
  213. item.StartDate = v.StartDate.Format(utils.FormatDate)
  214. item.EndDate = v.EndDate.Format(utils.FormatDate)
  215. item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
  216. item.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
  217. return
  218. }
  219. type BaseFromNationalStatisticsIndexDetailItem struct {
  220. BaseFromNationalStatisticsIndexItem
  221. DataList []*BaseFromNationalStatisticsIndexDetailData `description:"数据列表"`
  222. }
  223. type BaseFromNationalStatisticsIndexDetailData struct {
  224. DataTime string `description:"数据日期"`
  225. Value float64 `description:"数据值"`
  226. }
  227. func GetBaseFromNationalStatisticsIndexByIndexCode(indexCode string) (item *BaseFromNationalStatisticsIndex, err error) {
  228. o := global.DbMap[utils.DbNameIndex]
  229. sql := `SELECT * FROM base_from_national_statistics_index WHERE index_code = ? LIMIT 1`
  230. err = o.Raw(sql, indexCode).First(&item).Error
  231. return
  232. }