base_from_fenwei.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  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. // BaseFromFenwei 涌溢咨询
  12. type BaseFromFenwei struct{}
  13. type BaseFromFenweiData struct {
  14. FenweiDataId int `gorm:"column:fenwei_data_id;primaryKey"`
  15. //enweiDataId int `orm:"column(fenwei_data_id);pk"`
  16. FenweiIndexId 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 *BaseFromFenweiData) TableName() string {
  25. return "base_from_fenwei_data"
  26. }
  27. func (e *BaseFromFenweiData) AfterFind(db *gorm.DB) (err error) {
  28. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  29. return
  30. }
  31. func GetBaseFromFenweiDataByCondition(condition string, pars []interface{}) (list []*BaseFromFenweiData, err error) {
  32. //o := orm.NewOrm()
  33. sql := `SELECT * FROM base_from_fenwei_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 BaseFromFenwei) 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. fenweiBaseDataAll, err := GetBaseFromFenweiDataByCondition(condition, pars)
  51. if err != nil && !utils.IsErrNoRow(err) {
  52. return
  53. }
  54. var isAdd bool
  55. addSql := ` INSERT INTO edb_data_fenwei(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 fenweiBaseDataAll {
  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 刷新汾渭数据指标数据
  84. func (obj BaseFromFenwei) 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. fenweiDataList, err := GetBaseFromFenweiDataByCondition(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_fenwei(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 fenweiDataList {
  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 BaseFromFenwei) GetSource() int {
  184. return utils.DATA_SOURCE_FENWEI
  185. }
  186. // GetSourceName 获取来源名称
  187. func (obj BaseFromFenwei) GetSourceName() string {
  188. return utils.DATA_SOURCE_NAME_FENWEI
  189. }
  190. type BaseFromFenweiIndex struct {
  191. FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
  192. //FenweiIndexId int64 `orm:"column(fenwei_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 *BaseFromFenweiIndex) 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 *BaseFromFenweiIndex) TableName() string {
  211. return "base_from_fenwei_index"
  212. }
  213. func (m *BaseFromFenweiIndex) 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 = int64(m.FenweiIndexId)
  221. return
  222. }
  223. func (m *BaseFromFenweiIndex) 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 *BaseFromFenweiIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  230. //o := orm.NewOrm()
  231. sql := ` UPDATE base_from_fenwei_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 *BaseFromFenweiIndex) GetByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
  237. //o := orm.NewOrm()
  238. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
  239. //err = o.Raw(sql, indexCode).QueryRow(&item)
  240. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  241. return
  242. }
  243. func (m *BaseFromFenweiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiIndex, 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_fenwei_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 BaseFromFenweiIndexList struct {
  259. //FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
  260. FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
  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 (y *BaseFromFenweiData) GetByIndexCode(indexCode string) (list []*BaseFromFenweiData, err error) {
  273. //o := orm.NewOrm()
  274. sql := ` SELECT * FROM base_from_fenwei_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 (y *BaseFromFenweiData) AddMulti(item []*BaseFromFenweiData) (err error) {
  280. //o := orm.NewOrm()
  281. //_, err = o.InsertMulti(1, item)
  282. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  283. return
  284. }
  285. // HandleFenweiExcelData 汾渭数据的excel数据
  286. type HandleFenweiExcelData struct {
  287. //ClassifyName string `description:"指标目录"`
  288. //ClassifySort int `description:"指标目录排序号"`
  289. IndexName string `description:"指标名称"`
  290. IndexCode string `description:"指标编码"`
  291. Unit string `description:"单位"`
  292. Sort int `description:"排序号"`
  293. Frequency string `description:"频度"`
  294. ClassifyId int `description:"分类ID"`
  295. ExcelDataMap map[string]string
  296. }
  297. type HandleFenweiExcelDataReq struct {
  298. List []*HandleFenweiExcelData
  299. TerminalCode string `description:"编码"`
  300. }
  301. type FenWeiNetIndexInfo struct {
  302. FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
  303. IndexName string `description:"指标名称"`
  304. //IndexCode string `description:"指标编码"`
  305. Unit string `description:"单位"`
  306. Frequency string `description:"频度"`
  307. TerminalCode string `description:"编码"`
  308. ClassifyName string `description:"分类名称"`
  309. DataTime string `description:"数据时间"`
  310. Value interface{} `description:"数据值"`
  311. }
  312. type HandleFenWeiNetDataReq struct {
  313. List []*FenWeiNetIndexInfo
  314. TerminalCode string `description:"编码"`
  315. }
  316. func (y *BaseFromFenweiData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  317. //o := orm.NewOrm()
  318. 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_fenwei_data WHERE index_code=? `
  319. //err = o.Raw(sql, indexCode).QueryRow(&item)
  320. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  321. // 获取最新值
  322. var lastVal float64
  323. sql = ` SELECT value AS latest_value FROM base_from_fenwei_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
  324. //err = o.Raw(sql, indexCode).QueryRow(&lastVal)
  325. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&lastVal).Error
  326. if err != nil {
  327. return
  328. }
  329. item.LatestValue = lastVal
  330. return
  331. }
  332. // BaseFromFenweiClassify 汾渭数据分类表
  333. type BaseFromFenweiClassify struct {
  334. //ClassifyId int `orm:"column(classify_id);pk"`
  335. ClassifyId int `gorm:"column:classify_id;primaryKey"`
  336. ClassifyName string `description:"分类名称"`
  337. ParentId int `description:"父级id"`
  338. SysUserId int `description:"创建人id"`
  339. SysUserRealName string `description:"创建人姓名"`
  340. Level int `description:"层级"`
  341. Sort int `description:"排序字段,越小越靠前,默认值:10"`
  342. ModifyTime time.Time `description:"修改时间"`
  343. CreateTime time.Time `description:"创建时间"`
  344. }
  345. func (y *BaseFromFenweiClassify) Add() (lastId int64, err error) {
  346. //o := orm.NewOrm()
  347. //lastId, err = o.Insert(y)
  348. err = global.DEFAULT_DB.Create(&y).Error
  349. if err != nil {
  350. return
  351. }
  352. lastId = int64(y.ClassifyId)
  353. return
  354. }
  355. func (y *BaseFromFenweiClassify) Update(updateCols []string) (err error) {
  356. //o := orm.NewOrm()
  357. //_, err = o.Update(y, updateCols...)
  358. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  359. return
  360. }
  361. func (y *BaseFromFenweiClassify) GetByClassifyName(classifyName string) (item []*BaseFromFenweiClassify, err error) {
  362. //o := orm.NewOrm()
  363. sql := ` SELECT * FROM base_from_fenwei_classify WHERE classify_name=? `
  364. //_, err = o.Raw(sql, classifyName).QueryRows(&item)
  365. err = global.DEFAULT_DB.Raw(sql, classifyName).Find(&item).Error
  366. if utils.IsErrNoRow(err) {
  367. return nil, nil
  368. }
  369. return
  370. }
  371. func (y *BaseFromFenweiClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiClassify, err error) {
  372. //o := orm.NewOrm()
  373. fields := strings.Join(fieldArr, ",")
  374. if len(fieldArr) == 0 {
  375. fields = `*`
  376. }
  377. order := `ORDER BY create_time DESC`
  378. if orderRule != "" {
  379. order = ` ORDER BY ` + orderRule
  380. }
  381. sql := fmt.Sprintf(`SELECT %s FROM base_from_fenwei_classify WHERE 1=1 %s %s`, fields, condition, order)
  382. //_, err = o.Raw(sql, pars).QueryRows(&items)
  383. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  384. return
  385. }
  386. // BaseFromFenweiClassifyItem 汾渭数据分类信息
  387. type BaseFromFenweiClassifyItem struct {
  388. ClassifyId int `description:"分类ID"`
  389. ClassifyName string `description:"分类名称"`
  390. ParentId int `description:"父级id"`
  391. Level int `description:"层级"`
  392. Sort int `description:"排序字段"`
  393. CreateTime string `description:"创建时间"`
  394. ModifyTime string `description:"修改时间"`
  395. Child []*BaseFromFenweiClassifyItem `description:"子分类"`
  396. }
  397. func (y *BaseFromFenweiClassify) Format2Item(origin *BaseFromFenweiClassify) (item *BaseFromFenweiClassifyItem) {
  398. if origin == nil {
  399. return
  400. }
  401. item = new(BaseFromFenweiClassifyItem)
  402. item.ClassifyId = origin.ClassifyId
  403. item.ClassifyName = origin.ClassifyName
  404. item.ParentId = origin.ParentId
  405. item.Level = origin.Level
  406. item.Sort = origin.Sort
  407. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  408. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  409. return
  410. }
  411. // MultiUpdateBaseFromFenweiDataValue 批量更新汾渭指标数据
  412. func MultiUpdateBaseFromFenweiDataValue(items []*BaseFromFenweiData) (err error) {
  413. if len(items) == 0 {
  414. return
  415. }
  416. //o := orm.NewOrm()
  417. to := global.DEFAULT_DB.Begin()
  418. defer func() {
  419. if err != nil {
  420. _ = to.Rollback()
  421. } else {
  422. _ = to.Commit()
  423. }
  424. }()
  425. sql := `UPDATE base_from_fenwei_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
  426. for _, v := range items {
  427. if v.IndexCode == "" || v.DataTime == "" {
  428. continue
  429. }
  430. err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
  431. if err != nil {
  432. return
  433. }
  434. }
  435. return
  436. }
  437. // GetBaseFromFenWeiIndexByIndexName 根据指标名称查询指标
  438. func GetBaseFromFenWeiIndexByIndexName(indexName string) (item *BaseFromFenweiIndex, err error) {
  439. //o := orm.NewOrm()
  440. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_name=? `
  441. //err = o.Raw(sql, indexName).QueryRow(&item)
  442. err = global.DEFAULT_DB.Raw(sql, indexName).First(&item).Error
  443. if utils.IsErrNoRow(err) {
  444. return nil, nil
  445. }
  446. return
  447. }
  448. // GetBaseFromFenweiDataByIndexCodeAndDataTime 根据指标编码和dataTime查询指标数据
  449. func GetBaseFromFenweiDataByIndexCodeAndDataTime(indexCode, dataTime string) (item *BaseFromFenweiData, err error) {
  450. //o := orm.NewOrm()
  451. sql := ` SELECT * FROM base_from_fenwei_data WHERE index_code=? AND data_time=? `
  452. //err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
  453. err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
  454. if utils.IsErrNoRow(err) {
  455. return nil, nil
  456. }
  457. return
  458. }
  459. // BatchAddBaseFromFenWeiData 批量插入指标数据
  460. func BatchAddBaseFromFenWeiData(items []*BaseFromFenweiData) (err error) {
  461. if len(items) == 0 {
  462. return
  463. }
  464. //o := orm.NewOrm()
  465. //_, err = o.InsertMulti(1, items)
  466. err = global.DEFAULT_DB.CreateInBatches(items, 1).Error
  467. return
  468. }
  469. // AddBaseFromFenWeiClassify 新增汾渭分类
  470. func AddBaseFromFenWeiClassify(item *BaseFromFenweiClassify) (classifyId int64, err error) {
  471. //o := orm.NewOrm()
  472. //classifyId, err = o.Insert(item)
  473. err = global.DEFAULT_DB.Create(&item).Error
  474. if err != nil {
  475. return
  476. }
  477. classifyId = int64(item.ClassifyId)
  478. return
  479. }
  480. // GetBaseFromFenWeiIndexByIndexCode 跟据指标编码查询指标信息
  481. func GetBaseFromFenWeiIndexByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
  482. //o := orm.NewOrm()
  483. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
  484. //err = o.Raw(sql, indexCode).QueryRow(&item)
  485. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  486. if utils.IsErrNoRow(err) {
  487. return nil, nil
  488. }
  489. return
  490. }
  491. // UpdateBaseFromFenweiData 更新汾渭数据
  492. func UpdateBaseFromFenweiData(data *BaseFromFenweiData) error {
  493. //o := orm.NewOrm()
  494. //_, err := o.Update(data)
  495. err := global.DEFAULT_DB.Save(&data).Error
  496. return err
  497. }