base_from_fenwei.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  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. // BaseFromFenwei 涌溢咨询
  11. type BaseFromFenwei struct{}
  12. type BaseFromFenweiData struct {
  13. FenweiDataId int `gorm:"column:fenwei_data_id;primaryKey"`
  14. //enweiDataId int `orm:"column(fenwei_data_id);pk"`
  15. FenweiIndexId 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 *BaseFromFenweiData) TableName() string {
  24. return "base_from_fenwei_data"
  25. }
  26. func GetBaseFromFenweiDataByCondition(condition string, pars []interface{}) (list []*BaseFromFenweiData, err error) {
  27. //o := orm.NewOrm()
  28. sql := `SELECT * FROM base_from_fenwei_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 BaseFromFenwei) 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. fenweiBaseDataAll, err := GetBaseFromFenweiDataByCondition(condition, pars)
  46. if err != nil && !utils.IsErrNoRow(err) {
  47. return
  48. }
  49. var isAdd bool
  50. addSql := ` INSERT INTO edb_data_fenwei(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 fenweiBaseDataAll {
  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 刷新汾渭数据指标数据
  78. func (obj BaseFromFenwei) 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. fenweiDataList, err := GetBaseFromFenweiDataByCondition(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_fenwei(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  130. var isAdd bool
  131. for _, v := range fenweiDataList {
  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 BaseFromFenwei) GetSource() int {
  177. return utils.DATA_SOURCE_FENWEI
  178. }
  179. // GetSourceName 获取来源名称
  180. func (obj BaseFromFenwei) GetSourceName() string {
  181. return utils.DATA_SOURCE_NAME_FENWEI
  182. }
  183. type BaseFromFenweiIndex struct {
  184. FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
  185. //FenweiIndexId int64 `orm:"column(fenwei_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 *BaseFromFenweiIndex) TableName() string {
  199. return "base_from_fenwei_index"
  200. }
  201. func (m *BaseFromFenweiIndex) 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 = int64(m.FenweiIndexId)
  209. return
  210. }
  211. func (m *BaseFromFenweiIndex) 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 *BaseFromFenweiIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  218. //o := orm.NewOrm()
  219. sql := ` UPDATE base_from_fenwei_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 *BaseFromFenweiIndex) GetByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
  225. //o := orm.NewOrm()
  226. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
  227. //err = o.Raw(sql, indexCode).QueryRow(&item)
  228. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  229. return
  230. }
  231. func (m *BaseFromFenweiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiIndex, 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_fenwei_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 BaseFromFenweiIndexList struct {
  247. //FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
  248. FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
  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 (y *BaseFromFenweiData) GetByIndexCode(indexCode string) (list []*BaseFromFenweiData, err error) {
  261. //o := orm.NewOrm()
  262. sql := ` SELECT * FROM base_from_fenwei_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 (y *BaseFromFenweiData) AddMulti(item []*BaseFromFenweiData) (err error) {
  268. //o := orm.NewOrm()
  269. //_, err = o.InsertMulti(1, item)
  270. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  271. return
  272. }
  273. // HandleFenweiExcelData 汾渭数据的excel数据
  274. type HandleFenweiExcelData struct {
  275. //ClassifyName string `description:"指标目录"`
  276. //ClassifySort int `description:"指标目录排序号"`
  277. IndexName string `description:"指标名称"`
  278. IndexCode string `description:"指标编码"`
  279. Unit string `description:"单位"`
  280. Sort int `description:"排序号"`
  281. Frequency string `description:"频度"`
  282. ClassifyId int `description:"分类ID"`
  283. ExcelDataMap map[string]string
  284. }
  285. type HandleFenweiExcelDataReq struct {
  286. List []*HandleFenweiExcelData
  287. TerminalCode string `description:"编码"`
  288. }
  289. type FenWeiNetIndexInfo struct {
  290. FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
  291. IndexName string `description:"指标名称"`
  292. //IndexCode string `description:"指标编码"`
  293. Unit string `description:"单位"`
  294. Frequency string `description:"频度"`
  295. TerminalCode string `description:"编码"`
  296. ClassifyName string `description:"分类名称"`
  297. DataTime string `description:"数据时间"`
  298. Value interface{} `description:"数据值"`
  299. }
  300. type HandleFenWeiNetDataReq struct {
  301. List []*FenWeiNetIndexInfo
  302. TerminalCode string `description:"编码"`
  303. }
  304. func (y *BaseFromFenweiData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  305. //o := orm.NewOrm()
  306. 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=? `
  307. //err = o.Raw(sql, indexCode).QueryRow(&item)
  308. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  309. // 获取最新值
  310. var lastVal float64
  311. sql = ` SELECT value AS latest_value FROM base_from_fenwei_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
  312. //err = o.Raw(sql, indexCode).QueryRow(&lastVal)
  313. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&lastVal).Error
  314. if err != nil {
  315. return
  316. }
  317. item.LatestValue = lastVal
  318. return
  319. }
  320. // BaseFromFenweiClassify 汾渭数据分类表
  321. type BaseFromFenweiClassify struct {
  322. //ClassifyId int `orm:"column(classify_id);pk"`
  323. ClassifyId int `gorm:"column:classify_id;primaryKey"`
  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 (y *BaseFromFenweiClassify) Add() (lastId int64, err error) {
  334. //o := orm.NewOrm()
  335. //lastId, err = o.Insert(y)
  336. err = global.DEFAULT_DB.Create(&y).Error
  337. if err != nil {
  338. return
  339. }
  340. lastId = int64(y.ClassifyId)
  341. return
  342. }
  343. func (y *BaseFromFenweiClassify) Update(updateCols []string) (err error) {
  344. //o := orm.NewOrm()
  345. //_, err = o.Update(y, updateCols...)
  346. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  347. return
  348. }
  349. func (y *BaseFromFenweiClassify) GetByClassifyName(classifyName string) (item []*BaseFromFenweiClassify, err error) {
  350. //o := orm.NewOrm()
  351. sql := ` SELECT * FROM base_from_fenwei_classify WHERE classify_name=? `
  352. //_, err = o.Raw(sql, classifyName).QueryRows(&item)
  353. err = global.DEFAULT_DB.Raw(sql, classifyName).Find(&item).Error
  354. if utils.IsErrNoRow(err) {
  355. return nil, nil
  356. }
  357. return
  358. }
  359. func (y *BaseFromFenweiClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiClassify, err error) {
  360. //o := orm.NewOrm()
  361. fields := strings.Join(fieldArr, ",")
  362. if len(fieldArr) == 0 {
  363. fields = `*`
  364. }
  365. order := `ORDER BY create_time DESC`
  366. if orderRule != "" {
  367. order = ` ORDER BY ` + orderRule
  368. }
  369. sql := fmt.Sprintf(`SELECT %s FROM base_from_fenwei_classify WHERE 1=1 %s %s`, fields, condition, order)
  370. //_, err = o.Raw(sql, pars).QueryRows(&items)
  371. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  372. return
  373. }
  374. // BaseFromFenweiClassifyItem 汾渭数据分类信息
  375. type BaseFromFenweiClassifyItem struct {
  376. ClassifyId int `description:"分类ID"`
  377. ClassifyName string `description:"分类名称"`
  378. ParentId int `description:"父级id"`
  379. Level int `description:"层级"`
  380. Sort int `description:"排序字段"`
  381. CreateTime string `description:"创建时间"`
  382. ModifyTime string `description:"修改时间"`
  383. Child []*BaseFromFenweiClassifyItem `description:"子分类"`
  384. }
  385. func (y *BaseFromFenweiClassify) Format2Item(origin *BaseFromFenweiClassify) (item *BaseFromFenweiClassifyItem) {
  386. if origin == nil {
  387. return
  388. }
  389. item = new(BaseFromFenweiClassifyItem)
  390. item.ClassifyId = origin.ClassifyId
  391. item.ClassifyName = origin.ClassifyName
  392. item.ParentId = origin.ParentId
  393. item.Level = origin.Level
  394. item.Sort = origin.Sort
  395. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  396. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  397. return
  398. }
  399. // MultiUpdateBaseFromFenweiDataValue 批量更新汾渭指标数据
  400. func MultiUpdateBaseFromFenweiDataValue(items []*BaseFromFenweiData) (err error) {
  401. if len(items) == 0 {
  402. return
  403. }
  404. //o := orm.NewOrm()
  405. to := global.DEFAULT_DB.Begin()
  406. defer func() {
  407. if err != nil {
  408. _ = to.Rollback()
  409. } else {
  410. _ = to.Commit()
  411. }
  412. }()
  413. sql := `UPDATE base_from_fenwei_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
  414. for _, v := range items {
  415. if v.IndexCode == "" || v.DataTime == "" {
  416. continue
  417. }
  418. err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
  419. if err != nil {
  420. return
  421. }
  422. }
  423. return
  424. }
  425. // GetBaseFromFenWeiIndexByIndexName 根据指标名称查询指标
  426. func GetBaseFromFenWeiIndexByIndexName(indexName string) (item *BaseFromFenweiIndex, err error) {
  427. //o := orm.NewOrm()
  428. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_name=? `
  429. //err = o.Raw(sql, indexName).QueryRow(&item)
  430. err = global.DEFAULT_DB.Raw(sql, indexName).First(&item).Error
  431. if utils.IsErrNoRow(err) {
  432. return nil, nil
  433. }
  434. return
  435. }
  436. // GetBaseFromFenweiDataByIndexCodeAndDataTime 根据指标编码和dataTime查询指标数据
  437. func GetBaseFromFenweiDataByIndexCodeAndDataTime(indexCode, dataTime string) (item *BaseFromFenweiData, err error) {
  438. //o := orm.NewOrm()
  439. sql := ` SELECT * FROM base_from_fenwei_data WHERE index_code=? AND data_time=? `
  440. //err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
  441. err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
  442. if utils.IsErrNoRow(err) {
  443. return nil, nil
  444. }
  445. return
  446. }
  447. // BatchAddBaseFromFenWeiData 批量插入指标数据
  448. func BatchAddBaseFromFenWeiData(items []*BaseFromFenweiData) (err error) {
  449. if len(items) == 0 {
  450. return
  451. }
  452. //o := orm.NewOrm()
  453. //_, err = o.InsertMulti(1, items)
  454. err = global.DEFAULT_DB.CreateInBatches(items, 1).Error
  455. return
  456. }
  457. // AddBaseFromFenWeiClassify 新增汾渭分类
  458. func AddBaseFromFenWeiClassify(item *BaseFromFenweiClassify) (classifyId int64, err error) {
  459. //o := orm.NewOrm()
  460. //classifyId, err = o.Insert(item)
  461. err = global.DEFAULT_DB.Create(&item).Error
  462. if err != nil {
  463. return
  464. }
  465. classifyId = int64(item.ClassifyId)
  466. return
  467. }
  468. // GetBaseFromFenWeiIndexByIndexCode 跟据指标编码查询指标信息
  469. func GetBaseFromFenWeiIndexByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
  470. //o := orm.NewOrm()
  471. sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
  472. //err = o.Raw(sql, indexCode).QueryRow(&item)
  473. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  474. if utils.IsErrNoRow(err) {
  475. return nil, nil
  476. }
  477. return
  478. }
  479. // UpdateBaseFromFenweiData 更新汾渭数据
  480. func UpdateBaseFromFenweiData(data *BaseFromFenweiData) error {
  481. //o := orm.NewOrm()
  482. //_, err := o.Update(data)
  483. err := global.DEFAULT_DB.Save(&data).Error
  484. return err
  485. }