base_from_ccf.go 14 KB

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