base_from_ccf.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/utils"
  5. "fmt"
  6. "gorm.io/gorm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // BaseFromCCF CCF化纤信息
  12. type BaseFromCCF struct{}
  13. type BaseFromCCFData struct {
  14. //BaseFromCcfDataId int `orm:"column(base_from_ccf_data_id);pk"`
  15. BaseFromCcfDataId int `gorm:"column:base_from_ccf_data_id;primaryKey"`
  16. BaseFromCcfIndexId int
  17. IndexCode string
  18. DataTime string
  19. Value string
  20. CreateTime time.Time
  21. ModifyTime time.Time
  22. DataTimestamp int64
  23. }
  24. func (m *BaseFromCCFData) TableName() string {
  25. return "base_from_ccf_data"
  26. }
  27. func (e *BaseFromCCFData) AfterFind(db *gorm.DB) (err error) {
  28. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  29. return
  30. }
  31. func GetBaseFromCCFDataByCondition(condition string, pars []interface{}) (list []*BaseFromCCFData, err error) {
  32. //o := orm.NewOrm()
  33. sql := `SELECT * FROM base_from_ccf_data WHERE 1=1 `
  34. if condition != "" {
  35. sql += condition
  36. }
  37. //_, err = o.Raw(sql, pars).QueryRows(&list)
  38. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  39. return
  40. }
  41. // Add 添加
  42. func (obj BaseFromCCF) Add(edbCode string) (err error) {
  43. //o := orm.NewOrm()
  44. var condition string
  45. var pars []interface{}
  46. if edbCode != "" {
  47. condition += " AND index_code = ? "
  48. pars = append(pars, edbCode)
  49. }
  50. ccfBaseDataAll, err := GetBaseFromCCFDataByCondition(condition, pars)
  51. if err != nil && !utils.IsErrNoRow(err) {
  52. return
  53. }
  54. var isAdd bool
  55. addSql := ` INSERT INTO edb_data_ccf(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  56. existMap := make(map[string]string)
  57. for _, sv := range ccfBaseDataAll {
  58. eDate := sv.DataTime
  59. dataTime, err := time.Parse(utils.FormatDate, eDate)
  60. if err != nil {
  61. return err
  62. }
  63. timestamp := dataTime.UnixNano() / 1e6
  64. timeStr := fmt.Sprintf("%d", timestamp)
  65. if _, ok := existMap[eDate]; !ok {
  66. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  67. isAdd = true
  68. }
  69. existMap[eDate] = sv.Value
  70. }
  71. if isAdd {
  72. addSql = strings.TrimRight(addSql, ",")
  73. utils.FileLog.Info("addSql:" + addSql)
  74. //_, err = o.Raw(addSql).Exec()
  75. err = global.DEFAULT_DB.Exec(addSql).Error
  76. if err != nil {
  77. return err
  78. }
  79. }
  80. return
  81. }
  82. // Refresh 刷新CCF化纤指标数据
  83. func (obj BaseFromCCF) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
  84. source := obj.GetSource()
  85. //o := orm.NewOrm()
  86. if err != nil {
  87. return
  88. }
  89. edbInfoIdStr := strconv.Itoa(edbInfoId)
  90. //计算数据
  91. var condition string
  92. var pars []interface{}
  93. if edbCode != "" {
  94. condition += " AND index_code=? "
  95. pars = append(pars, edbCode)
  96. }
  97. if startDate != "" {
  98. condition += " AND data_time>=? "
  99. pars = append(pars, startDate)
  100. }
  101. ccfDataList, err := GetBaseFromCCFDataByCondition(condition, pars)
  102. if err != nil {
  103. return
  104. }
  105. // 真实数据的最大日期 , 插入规则配置的日期
  106. var realDataMaxDate, edbDataInsertConfigDate time.Time
  107. var edbDataInsertConfig *EdbDataInsertConfig
  108. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  109. {
  110. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  111. if err != nil && !utils.IsErrNoRow(err) {
  112. return
  113. }
  114. if edbDataInsertConfig != nil {
  115. edbDataInsertConfigDate = edbDataInsertConfig.Date
  116. }
  117. }
  118. var existCondition string
  119. var existPars []interface{}
  120. existCondition += " AND edb_info_id=? "
  121. existPars = append(existPars, edbInfoId)
  122. if startDate != "" {
  123. existCondition += " AND data_time>=? "
  124. existPars = append(existPars, startDate)
  125. }
  126. existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
  127. if err != nil {
  128. return err
  129. }
  130. existMap := make(map[string]*EdbInfoSearchData)
  131. for _, v := range existList {
  132. existMap[v.DataTime] = v
  133. }
  134. addSql := ` INSERT INTO edb_data_ccf(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  135. var isAdd bool
  136. for _, v := range ccfDataList {
  137. item := v
  138. eDate := item.DataTime
  139. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  140. if err != nil {
  141. return err
  142. }
  143. if findItem, ok := existMap[v.DataTime]; !ok {
  144. sValue := item.Value
  145. timestamp := dataTime.UnixNano() / 1e6
  146. timeStr := fmt.Sprintf("%d", timestamp)
  147. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  148. isAdd = true
  149. } else {
  150. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  151. err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
  152. if err != nil {
  153. return err
  154. }
  155. }
  156. }
  157. // 下面代码主要目的是处理掉手动插入的数据判断
  158. {
  159. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  160. realDataMaxDate = dataTime
  161. }
  162. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  163. isFindConfigDateRealData = true
  164. }
  165. }
  166. }
  167. // 处理手工数据补充的配置
  168. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
  169. if isAdd {
  170. addSql = strings.TrimRight(addSql, ",")
  171. //_, err = o.Raw(addSql).Exec()
  172. err = global.DEFAULT_DB.Exec(addSql).Error
  173. if err != nil {
  174. fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
  175. return
  176. }
  177. }
  178. return
  179. }
  180. // GetSource 获取来源编码id
  181. func (obj BaseFromCCF) GetSource() int {
  182. return utils.DATA_SOURCE_CCF
  183. }
  184. // GetSourceName 获取来源名称
  185. func (obj BaseFromCCF) GetSourceName() string {
  186. return utils.DATA_SOURCE_NAME_CCF
  187. }
  188. type BaseFromCCFIndex struct {
  189. BaseFromCcfIndexId int64 `gorm:"column:base_from_ccf_index_id;primaryKey"`
  190. //BaseFromCcfIndexId int64 `orm:"column(base_from_ccf_index_id);pk"`
  191. IndexCode string
  192. IndexName string
  193. Frequency string
  194. Unit string
  195. ClassifyId int
  196. StartDate string
  197. EndDate string
  198. Sort int
  199. TerminalCode string
  200. CreateTime time.Time
  201. ModifyTime time.Time
  202. }
  203. func (e *BaseFromCCFIndex) AfterFind(db *gorm.DB) (err error) {
  204. e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
  205. e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
  206. return
  207. }
  208. func (m *BaseFromCCFIndex) TableName() string {
  209. return "base_from_ccf_index"
  210. }
  211. func (m *BaseFromCCFIndex) Add() (lastId int64, err error) {
  212. //o := orm.NewOrm()
  213. //lastId, err = o.Insert(m)
  214. err = global.DEFAULT_DB.Create(&m).Error
  215. if err != nil {
  216. return
  217. }
  218. lastId = m.BaseFromCcfIndexId
  219. return
  220. }
  221. func (m *BaseFromCCFIndex) Update(updateCols []string) (err error) {
  222. //o := orm.NewOrm()
  223. //_, err = o.Update(m, updateCols...)
  224. err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
  225. return
  226. }
  227. func (m *BaseFromCCFIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  228. //o := orm.NewOrm()
  229. sql := ` UPDATE base_from_ccf_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
  230. //_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
  231. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
  232. return
  233. }
  234. func (m *BaseFromCCFIndex) GetByIndexCode(indexCode string) (item *BaseFromCCFIndex, err error) {
  235. //o := orm.NewOrm()
  236. sql := ` SELECT * FROM base_from_ccf_index WHERE index_code=? `
  237. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  238. //err = o.Raw(sql, indexCode).QueryRow(&item)
  239. return
  240. }
  241. func (m *BaseFromCCFIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCCFIndex, err error) {
  242. //o := orm.NewOrm()
  243. fields := strings.Join(fieldArr, ",")
  244. if len(fieldArr) == 0 {
  245. fields = `*`
  246. }
  247. order := `ORDER BY create_time DESC`
  248. if orderRule != "" {
  249. order = ` ORDER BY ` + orderRule
  250. }
  251. sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_index WHERE 1=1 %s %s`, fields, condition, order)
  252. //_, err = o.Raw(sql, pars).QueryRows(&items)
  253. err = global.DEFAULT_DB.Raw(sql, pars).Find(&items).Error
  254. return
  255. }
  256. type BaseFromCCFIndexList struct {
  257. CcfIndexId int64 `gorm:"column:ccf_index_id;primaryKey"`
  258. //CcfIndexId int64 `orm:"column(ccf_index_id);pk"`
  259. IndexCode string
  260. IndexName string
  261. Frequency string
  262. Unit string
  263. ClassifyId int
  264. StartDate string
  265. EndDate string
  266. TerminalCode string
  267. CreateTime string
  268. ModifyTime string
  269. }
  270. func (m *BaseFromCCFData) GetByIndexCode(indexCode string) (list []*BaseFromCCFData, err error) {
  271. //o := orm.NewOrm()
  272. sql := ` SELECT * FROM base_from_ccf_data WHERE index_code=? `
  273. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  274. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  275. return
  276. }
  277. func (m *BaseFromCCFData) AddMulti(item []*BaseFromCCFData) (err error) {
  278. //o := orm.NewOrm()
  279. //_, err = o.InsertMulti(100, item)
  280. err = global.DEFAULT_DB.CreateInBatches(&item, 100).Error
  281. return
  282. }
  283. // HandleCCFEdbData CCF化纤的指标数据
  284. type HandleCCFEdbData struct {
  285. IndexName string `description:"指标名称"`
  286. IndexCode string `description:"指标编码"`
  287. ClassifyId int `description:"分类ID"`
  288. Unit string `description:"单位"`
  289. Sort int `description:"排序"`
  290. Frequency string `description:"频度"`
  291. TerminalCode string `description:"终端编码"`
  292. DateData map[string]string `description:"日期数据"`
  293. }
  294. type HandleCCFEdbDataReq struct {
  295. List []*HandleCCFEdbData
  296. TerminalCode string `description:"编码"`
  297. }
  298. type HandleCCFTableData struct {
  299. ClassifyId int `description:"分类ID"`
  300. FromPage string `description:"表格来源"`
  301. TableDate time.Time `description:"表格日期"`
  302. TableContent string `description:"表格HTML"`
  303. }
  304. type HandleCCFStockTableReq struct {
  305. Table *HandleCCFTableData
  306. TerminalCode string `description:"编码"`
  307. }
  308. func (m *BaseFromCCFData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  309. //o := orm.NewOrm()
  310. 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_ccf_data WHERE index_code=? `
  311. //err = o.Raw(sql, indexCode).QueryRow(&item)
  312. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  313. var latest_value float64
  314. sql = ` SELECT value AS latest_value FROM base_from_ccf_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
  315. //err = o.Raw(sql, indexCode).QueryRow(&latest_value)
  316. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
  317. item.LatestValue = latest_value
  318. return
  319. }
  320. // BaseFromCCFClassify CCF化纤数据分类表
  321. type BaseFromCCFClassify struct {
  322. ClassifyId int `gorm:"column:classify_id;primaryKey"`
  323. //ClassifyId int `orm:"column(classify_id);pk"`
  324. ClassifyName string `description:"分类名称"`
  325. ParentId int `description:"父级id"`
  326. SysUserId int `description:"创建人id"`
  327. SysUserRealName string `description:"创建人姓名"`
  328. Level int `description:"层级"`
  329. Sort int `description:"排序字段,越小越靠前,默认值:10"`
  330. ModifyTime time.Time `description:"修改时间"`
  331. CreateTime time.Time `description:"创建时间"`
  332. }
  333. func (m *BaseFromCCFClassify) Add() (lastId int64, err error) {
  334. //o := orm.NewOrm()
  335. //lastId, err = o.Insert(m)
  336. err = global.DEFAULT_DB.Create(&m).Error
  337. if err != nil {
  338. return
  339. }
  340. lastId = int64(m.ClassifyId)
  341. return
  342. }
  343. func (m *BaseFromCCFClassify) Update(updateCols []string) (err error) {
  344. //o := orm.NewOrm()
  345. //_, err = o.Update(m, updateCols...)
  346. err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
  347. return
  348. }
  349. func (m *BaseFromCCFClassify) GetByClassifyName(classifyName string) (item *BaseFromCCFClassify, err error) {
  350. //o := orm.NewOrm()
  351. sql := ` SELECT * FROM base_from_ccf_classify WHERE classify_name=? `
  352. //err = o.Raw(sql, classifyName).QueryRow(&item)
  353. err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
  354. return
  355. }
  356. func (m *BaseFromCCFClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCCFClassify, err error) {
  357. //o := orm.NewOrm()
  358. fields := strings.Join(fieldArr, ",")
  359. if len(fieldArr) == 0 {
  360. fields = `*`
  361. }
  362. order := `ORDER BY create_time DESC`
  363. if orderRule != "" {
  364. order = ` ORDER BY ` + orderRule
  365. }
  366. sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_classify WHERE 1=1 %s %s`, fields, condition, order)
  367. //_, err = o.Raw(sql, pars).QueryRows(&items)
  368. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  369. return
  370. }
  371. // BaseFromCCFClassifyItem CCF化纤数据分类信息
  372. type BaseFromCCFClassifyItem struct {
  373. ClassifyId int `description:"分类ID"`
  374. ClassifyName string `description:"分类名称"`
  375. ParentId int `description:"父级id"`
  376. Level int `description:"层级"`
  377. Sort int `description:"排序字段"`
  378. CreateTime string `description:"创建时间"`
  379. ModifyTime string `description:"修改时间"`
  380. Child []*BaseFromCCFClassifyItem `description:"子分类"`
  381. }
  382. func (m *BaseFromCCFClassify) Format2Item(origin *BaseFromCCFClassify) (item *BaseFromCCFClassifyItem) {
  383. if origin == nil {
  384. return
  385. }
  386. item = new(BaseFromCCFClassifyItem)
  387. item.ClassifyId = origin.ClassifyId
  388. item.ClassifyName = origin.ClassifyName
  389. item.ParentId = origin.ParentId
  390. item.Level = origin.Level
  391. item.Sort = origin.Sort
  392. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  393. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  394. return
  395. }
  396. // MultiUpdateBaseFromCCFDataValue 批量更新CCF化纤指标数据
  397. func MultiUpdateBaseFromCCFDataValue(items []*BaseFromCCFData) (err error) {
  398. if len(items) == 0 {
  399. return
  400. }
  401. //o := orm.NewOrm()
  402. to := global.DEFAULT_DB.Begin()
  403. defer func() {
  404. if err != nil {
  405. _ = to.Rollback()
  406. } else {
  407. _ = to.Commit()
  408. }
  409. }()
  410. sql := `UPDATE base_from_ccf_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
  411. for _, v := range items {
  412. if v.IndexCode == "" || v.DataTime == "" {
  413. continue
  414. }
  415. err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
  416. if err != nil {
  417. return
  418. }
  419. }
  420. //p, err := o.Raw(sql).Prepare()
  421. //if err != nil {
  422. // return
  423. //}
  424. //defer func() {
  425. // _ = p.Close()
  426. //}()
  427. //for _, v := range items {
  428. // if v.IndexCode == "" || v.DataTime == "" {
  429. // continue
  430. // }
  431. // _, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
  432. // if err != nil {
  433. // return
  434. // }
  435. //}
  436. return
  437. }