base_from_usda_fas.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. package models
  2. import (
  3. sql2 "database/sql"
  4. "eta/eta_index_lib/global"
  5. "eta/eta_index_lib/utils"
  6. "fmt"
  7. "gorm.io/gorm"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // BaseFromUsdaFas 美国农业部
  13. type BaseFromUsdaFas struct{}
  14. type BaseFromUsdaFasData struct {
  15. BaseFromUsdaFasDataId int `gorm:"column:base_from_usda_fas_data_id;primaryKey"`
  16. //BaseFromUsdaFasDataId int `orm:"column(base_from_usda_fas_data_id);pk"`
  17. BaseFromUsdaFasIndexId int
  18. IndexCode string
  19. DataTime string
  20. Value string
  21. CreateTime time.Time
  22. ModifyTime time.Time
  23. DataTimestamp int64
  24. }
  25. func (e *BaseFromUsdaFasData) AfterFind(db *gorm.DB) (err error) {
  26. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  27. return
  28. }
  29. func GetBaseFromUsdaFasDataByCondition(condition string, pars []interface{}) (list []*BaseFromUsdaFasData, err error) {
  30. //o := orm.NewOrm()
  31. sql := `SELECT * FROM base_from_usda_fas_data WHERE 1=1 `
  32. if condition != "" {
  33. sql += condition
  34. }
  35. //_, err = o.Raw(sql, pars).QueryRows(&list)
  36. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  37. return
  38. }
  39. // Add 添加
  40. func (obj BaseFromUsdaFas) Add(edbCode string) (err error) {
  41. //o := orm.NewOrm()
  42. var condition string
  43. var pars []interface{}
  44. if edbCode != "" {
  45. condition += " AND index_code=? "
  46. pars = append(pars, edbCode)
  47. }
  48. UsdaFasBaseDataAll, err := GetBaseFromUsdaFasDataByCondition(condition, pars)
  49. if err != nil && !utils.IsErrNoRow(err) {
  50. return
  51. }
  52. var isAdd bool
  53. addSql := ` INSERT INTO edb_data_usda_fas(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  54. existMap := make(map[string]string)
  55. for _, sv := range UsdaFasBaseDataAll {
  56. eDate := sv.DataTime
  57. dataTime, err := time.Parse(utils.FormatDate, eDate)
  58. if err != nil {
  59. return err
  60. }
  61. timestamp := dataTime.UnixNano() / 1e6
  62. timeStr := fmt.Sprintf("%d", timestamp)
  63. if _, ok := existMap[eDate]; !ok {
  64. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  65. isAdd = true
  66. }
  67. existMap[eDate] = sv.Value
  68. }
  69. if isAdd {
  70. addSql = strings.TrimRight(addSql, ",")
  71. utils.FileLog.Info("addSql:" + addSql)
  72. //_,err=o.Raw(addSql).Exec()
  73. err = global.DEFAULT_DB.Exec(addSql).Error
  74. if err != nil {
  75. return err
  76. }
  77. }
  78. return
  79. }
  80. // Refresh 刷新涌益咨询指标数据
  81. func (obj BaseFromUsdaFas) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
  82. source := obj.GetSource()
  83. //o := orm.NewOrm()
  84. if err != nil {
  85. return
  86. }
  87. edbInfoIdStr := strconv.Itoa(edbInfoId)
  88. //计算数据
  89. var condition string
  90. var pars []interface{}
  91. if edbCode != "" {
  92. condition += " AND index_code=? "
  93. pars = append(pars, edbCode)
  94. }
  95. if startDate != "" {
  96. condition += " AND data_time>=? "
  97. pars = append(pars, startDate)
  98. }
  99. UsdaFasDataList, err := GetBaseFromUsdaFasDataByCondition(condition, pars)
  100. if err != nil {
  101. return
  102. }
  103. // 真实数据的最大日期 , 插入规则配置的日期
  104. var realDataMaxDate, edbDataInsertConfigDate time.Time
  105. var edbDataInsertConfig *EdbDataInsertConfig
  106. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  107. {
  108. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  109. if err != nil && !utils.IsErrNoRow(err) {
  110. return
  111. }
  112. if edbDataInsertConfig != nil {
  113. edbDataInsertConfigDate = edbDataInsertConfig.Date
  114. }
  115. }
  116. var existCondition string
  117. var existPars []interface{}
  118. existCondition += " AND edb_info_id=? "
  119. existPars = append(existPars, edbInfoId)
  120. if startDate != "" {
  121. existCondition += " AND data_time>=? "
  122. existPars = append(existPars, startDate)
  123. }
  124. existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
  125. if err != nil {
  126. return err
  127. }
  128. existMap := make(map[string]*EdbInfoSearchData)
  129. for _, v := range existList {
  130. existMap[v.DataTime] = v
  131. }
  132. addSql := ` INSERT INTO edb_data_usda_fas(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  133. var isAdd bool
  134. for _, v := range UsdaFasDataList {
  135. item := v
  136. eDate := item.DataTime
  137. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  138. if err != nil {
  139. return err
  140. }
  141. if findItem, ok := existMap[v.DataTime]; !ok {
  142. sValue := item.Value
  143. timestamp := dataTime.UnixNano() / 1e6
  144. timeStr := fmt.Sprintf("%d", timestamp)
  145. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  146. isAdd = true
  147. } else {
  148. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  149. err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
  150. if err != nil {
  151. return err
  152. }
  153. }
  154. }
  155. // 下面代码主要目的是处理掉手动插入的数据判断
  156. {
  157. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  158. realDataMaxDate = dataTime
  159. }
  160. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  161. isFindConfigDateRealData = true
  162. }
  163. }
  164. }
  165. // 处理手工数据补充的配置
  166. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
  167. if isAdd {
  168. addSql = strings.TrimRight(addSql, ",")
  169. //_,err = o.Raw(assSql).Exec()
  170. err = global.DEFAULT_DB.Exec(addSql).Error
  171. if err != nil {
  172. fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
  173. return
  174. }
  175. }
  176. return
  177. }
  178. // GetSource 获取来源编码id
  179. func (obj BaseFromUsdaFas) GetSource() int {
  180. return utils.DATA_SOURCE_USDA_FAS
  181. }
  182. // GetSourceName 获取来源名称
  183. func (obj BaseFromUsdaFas) GetSourceName() string {
  184. return utils.DATA_SOURCE_NAME_USDA_FAS
  185. }
  186. type BaseFromUsdaFasIndex struct {
  187. BaseFromUsdaFasIndexId int64 `gorm:"column:base_from_usda_fas_index_id;primaryKey"`
  188. //BaseFromUsdaFasIndexId int64 `orm:"column(base_from_usda_fas_index_id);pk"`
  189. IndexCode string
  190. IndexName string
  191. Frequency string
  192. Unit string
  193. StartDate string
  194. EndDate string
  195. EndValue float64
  196. ClassifyId int64
  197. Sort int
  198. BaseFileName string
  199. RenameFileName string
  200. TerminalCode string
  201. Country string `description:"国家"`
  202. Commodity string `description:"属性"`
  203. CreateTime time.Time
  204. ModifyTime time.Time
  205. }
  206. func (e *BaseFromUsdaFasIndex) AfterFind(db *gorm.DB) (err error) {
  207. e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
  208. e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
  209. return
  210. }
  211. type BaseFromUsdaFasIndexList struct {
  212. BaseFromUsdaFasIndexId int64 `gorm:"column:base_from_usda_fas_index_id;primaryKey"`
  213. //BaseFromUsdaFasIndexId int64 `orm:"column(base_from_usda_fas_index_id);pk"`
  214. IndexCode string
  215. IndexName string
  216. Frequency string
  217. Unit string
  218. Sort int
  219. ClassifyId int64
  220. StartDate string
  221. EndDate string
  222. TerminalCode string
  223. CreateTime string
  224. ModifyTime string
  225. }
  226. // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
  227. func (m *BaseFromUsdaFasIndexList) AfterFind(db *gorm.DB) (err error) {
  228. m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
  229. m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
  230. return
  231. }
  232. func (y *BaseFromUsdaFasData) GetByIndexCode(indexCode string) (list []*BaseFromUsdaFasData, err error) {
  233. //o := orm.NewOrm()
  234. sql := ` SELECT * FROM base_from_usda_fas_data WHERE index_code=? `
  235. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  236. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  237. return
  238. }
  239. func (y *BaseFromUsdaFasData) AddMulti(item []*BaseFromUsdaFasData) (err error) {
  240. //o := orm.NewOrm()
  241. //_, err = o.InsertMulti(1, item)
  242. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  243. return
  244. }
  245. // Update 修改
  246. func (y *BaseFromUsdaFasData) Update(updateCols []string) (err error) {
  247. //o := orm.NewOrm()
  248. //_, err = o.Update(y, updateCols...)
  249. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  250. return
  251. }
  252. // HandleUsdaFasExcelData 涌益咨询的excel数据
  253. type HandleUsdaFasExcelData struct {
  254. ClassifyName string `description:"指标目录"`
  255. ParentClassifyName string `description:"父级指标目录"`
  256. ClassifySort int `description:"指标目录排序号"`
  257. IndexName string `description:"指标名称"`
  258. IndexCode string `description:"指标编码"`
  259. Unit string `description:"单位"`
  260. Sort int `description:"排序号"`
  261. Frequency string `description:"频度"`
  262. Country string `description:"国家"`
  263. Commodity string `description:"属性"`
  264. ExcelDataMap map[string]string
  265. }
  266. type HandleUsdaFasExcelDataReq struct {
  267. List []*HandleUsdaFasExcelData
  268. TerminalCode string `description:"编码"`
  269. }
  270. func (y *BaseFromUsdaFasData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  271. //o := orm.NewOrm()
  272. sql := ` SELECT 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_usda_fas_data WHERE index_code=? `
  273. //err = o.Raw(sql, indexCode).QueryRow(&item)
  274. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  275. sql = ` SELECT value AS latest_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
  276. sql = fmt.Sprintf(sql, "base_from_usda_fas_data")
  277. //err = o.Raw(sql, indexCode).QueryRow(&latest_value)
  278. var latestValueNull sql2.NullFloat64
  279. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
  280. if err == nil && latestValueNull.Valid {
  281. item.LatestValue = latestValueNull.Float64
  282. }
  283. return
  284. }
  285. func (y *BaseFromUsdaFasIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  286. //o := orm.NewOrm()
  287. sql := ` UPDATE base_from_usda_fas_index SET start_date=?,end_date=?, end_value=?, modify_time=NOW() WHERE index_code=? `
  288. //_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
  289. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
  290. return
  291. }
  292. func (y *BaseFromUsdaFasIndex) GetByIndexCode(indexCode string) (item *BaseFromUsdaFasIndex, err error) {
  293. //o := orm.NewOrm()
  294. sql := ` SELECT * FROM base_from_usda_fas_index WHERE index_code=? `
  295. //err = o.Raw(sql, indexCode).QueryRow(&item)
  296. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  297. return
  298. }
  299. func (y *BaseFromUsdaFasIndex) Add() (lastId int64, err error) {
  300. //o := orm.NewOrm()
  301. //lastId, err = o.Insert(y)
  302. err = global.DEFAULT_DB.Create(&y).Error
  303. if err != nil {
  304. return
  305. }
  306. lastId = y.BaseFromUsdaFasIndexId
  307. return
  308. }
  309. // Update 修改
  310. func (y *BaseFromUsdaFasIndex) Update(updateCols []string) (err error) {
  311. //o := orm.NewOrm()
  312. //_, err = o.Update(y, updateCols...)
  313. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  314. return
  315. }
  316. // BaseFromUsdaFasClassify UsdaFas原始数据分类表
  317. type BaseFromUsdaFasClassify struct {
  318. ClassifyId int64 `gorm:"column:classify_id;primaryKey"`
  319. //ClassifyId int64 `orm:"column(classify_id);pk"`
  320. ClassifyName string `description:"分类名称"`
  321. ClassifyNameEn string `description:"分类名称"`
  322. ParentId int `description:"父级id"`
  323. SysUserId int `description:"创建人id"`
  324. SysUserRealName string `description:"创建人姓名"`
  325. Level int `description:"层级"`
  326. Sort int `description:"排序字段,越小越靠前,默认值:10"`
  327. ModifyTime time.Time `description:"修改时间"`
  328. CreateTime time.Time `description:"创建时间"`
  329. }
  330. func (y *BaseFromUsdaFasClassify) Add() (lastId int64, err error) {
  331. //o := orm.NewOrm()
  332. //lastId, err = o.Insert(y)
  333. err = global.DEFAULT_DB.Create(&y).Error
  334. if err != nil {
  335. return
  336. }
  337. lastId = int64(y.ClassifyId)
  338. return
  339. }
  340. // Update 修改
  341. func (y *BaseFromUsdaFasClassify) Update(updateCols []string) (err error) {
  342. //o := orm.NewOrm()
  343. //_, err = o.Update(y, updateCols...)
  344. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  345. return
  346. }
  347. func (y *BaseFromUsdaFasClassify) GetByClassifyName(classifyName string) (item *BaseFromUsdaFasClassify, err error) {
  348. //o := orm.NewOrm()
  349. sql := ` SELECT * FROM base_from_usda_fas_classify WHERE classify_name=? `
  350. //err = o.Raw(sql, classifyName).QueryRow(&item)
  351. err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
  352. return
  353. }
  354. func (y *BaseFromUsdaFasClassify) GetParentClassify() (items []*BaseFromUsdaFasClassify, err error) {
  355. //o := orm.NewOrm()
  356. sql := ` SELECT * FROM base_from_usda_fas_classify WHERE parent_id=0 `
  357. //_, err = o.Raw(sql).QueryRows(&items)
  358. err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
  359. return
  360. }