base_from_ccf.go 14 KB

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