base_from_ccf.go 15 KB

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