edb_info.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "hongze/hongze_edb_lib/utils"
  7. "time"
  8. )
  9. type EdbInfo struct {
  10. EdbInfoId int `orm:"column(edb_info_id);pk"`
  11. SourceName string `description:"来源名称"`
  12. Source int `description:"来源id"`
  13. EdbCode string `description:"指标编码"`
  14. EdbName string `description:"指标名称"`
  15. EdbNameSource string `description:"指标名称来源"`
  16. Frequency string `description:"频率"`
  17. Unit string `description:"单位"`
  18. StartDate string `description:"起始日期"`
  19. EndDate string `description:"终止日期"`
  20. ClassifyId int `description:"分类id"`
  21. SysUserId int
  22. SysUserRealName string
  23. UniqueCode string `description:"指标唯一编码"`
  24. CreateTime time.Time
  25. ModifyTime time.Time
  26. MinValue float64 `description:"指标最小值"`
  27. MaxValue float64 `description:"指标最大值"`
  28. CalculateFormula string `description:"计算公式"`
  29. EdbType int `description:"指标类型:1:基础指标,2:计算指标"`
  30. Sort int `description:"排序字段"`
  31. MoveType int `description:"移动方式:1:领先(默认),2:滞后"`
  32. MoveFrequency string `description:"移动频度"`
  33. NoUpdate int8 `description:"是否停止更新,0:继续更新;1:停止更新"`
  34. ServerUrl string `description:"服务器地址"`
  35. EdbInfoType int `description:"指标类型,0:普通指标,1:预测指标"`
  36. EdbNameEn string `description:"英文指标名称"`
  37. UnitEn string `description:"英文单位"`
  38. LatestDate string `description:"数据最新日期"`
  39. LatestValue float64 `description:"数据最新值"`
  40. ChartImage string `description:"图表图片"`
  41. }
  42. // AddEdbInfo 添加指标
  43. func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
  44. o := orm.NewOrm()
  45. lastId, err = o.Insert(item)
  46. return
  47. }
  48. // EdbInfoList 指标数据列表
  49. type EdbInfoList struct {
  50. EdbInfoId int `orm:"column(edb_info_id);pk"`
  51. SourceName string `description:"来源名称"`
  52. Source int `description:"来源id"`
  53. EdbCode string `description:"指标编码"`
  54. EdbName string `description:"指标名称"`
  55. Frequency string `description:"频率"`
  56. Unit string `description:"单位"`
  57. StartDate string `description:"起始日期"`
  58. EndDate string `description:"终止日期"`
  59. ClassifyId int `description:"分类id"`
  60. UniqueCode string `description:"指标唯一编码"`
  61. SysUserId int `description:"创建人id"`
  62. SysUserRealName string `description:"创建人姓名"`
  63. ModifyTime string `description:"最新修改时间"`
  64. EdbNameAlias string `json:"-" description:"指标名称,别名"`
  65. EdbType int `description:"指标类型:1:基础指标,2:计算指标"`
  66. DataList []*EdbData
  67. }
  68. // GetEdbInfoByName 根据指标名称获取所有的指标数据列表
  69. func GetEdbInfoByName(edbName string) (items []*EdbInfoList, err error) {
  70. o := orm.NewOrm()
  71. sql := ` SELECT * FROM edb_info WHERE edb_name=? `
  72. _, err = o.Raw(sql, edbName).QueryRows(&items)
  73. return
  74. }
  75. // ModifyEdbInfoNameSource 根据来源修改指标名称
  76. func ModifyEdbInfoNameSource(edbNameSource string, edbInfoId int) (err error) {
  77. o := orm.NewOrm()
  78. sql := ` UPDATE edb_info SET edb_name_source=? WHERE edb_info_id = ? `
  79. _, err = o.Raw(sql, edbNameSource, edbInfoId).Exec()
  80. return
  81. }
  82. // GetEdbInfoById 根据指标id获取指标信息
  83. func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
  84. o := orm.NewOrm()
  85. sql := ` SELECT * FROM edb_info WHERE edb_info_id=? `
  86. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  87. return
  88. }
  89. // Update 更新EdbInfo信息
  90. func (edbInfo *EdbInfo) Update(cols []string) (err error) {
  91. o := orm.NewOrm()
  92. _, err = o.Update(edbInfo, cols...)
  93. return
  94. }
  95. // EdbInfoSearchData
  96. type EdbInfoSearchData struct {
  97. EdbDataId int `description:"数据ID"`
  98. DataTime string `description:"数据日期"`
  99. Value float64 `description:"数据"`
  100. }
  101. // GetEdbDataListAll 获取指标数据列表 order:1升序,其余值为降序
  102. func GetEdbDataListAll(condition string, pars []interface{}, source, order int) (item []*EdbInfoSearchData, err error) {
  103. o := orm.NewOrm()
  104. sql := ``
  105. tableName := GetEdbDataTableName(source)
  106. sql = ` SELECT * FROM %s WHERE 1=1 `
  107. sql = fmt.Sprintf(sql, tableName)
  108. if condition != "" {
  109. sql += condition
  110. }
  111. if order == 1 {
  112. sql += ` ORDER BY data_time ASC `
  113. } else {
  114. sql += ` ORDER BY data_time DESC `
  115. }
  116. _, err = o.Raw(sql, pars).QueryRows(&item)
  117. return
  118. }
  119. // EdbInfoMaxAndMinInfo 指标最新数据记录结构体
  120. type EdbInfoMaxAndMinInfo struct {
  121. MinDate string `description:"最小日期"`
  122. MaxDate string `description:"最大日期"`
  123. MinValue float64 `description:"最小值"`
  124. MaxValue float64 `description:"最大值"`
  125. LatestValue float64 `description:"最新值"`
  126. }
  127. // GetEdbInfoMaxAndMinInfo 获取指标的最新数据记录信息
  128. func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  129. o := orm.NewOrm()
  130. sql := ``
  131. tableName := GetEdbDataTableName(source)
  132. 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 %s WHERE edb_code=? `
  133. sql = fmt.Sprintf(sql, tableName)
  134. err = o.Raw(sql, edbCode).QueryRow(&item)
  135. var latest_value float64
  136. sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
  137. sql = fmt.Sprintf(sql, tableName)
  138. err = o.Raw(sql, edbCode).QueryRow(&latest_value)
  139. item.LatestValue = latest_value
  140. return
  141. }
  142. // ModifyEdbInfoMaxAndMinInfo 修改指标的最新数据信息
  143. func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
  144. o := orm.NewOrm()
  145. sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
  146. _, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, edbInfoId).Exec()
  147. return
  148. }
  149. // GetEdbDataCount 获取edb指标数据的数量; order:1升序,其余值为降序
  150. func GetEdbDataCount(condition string, pars []interface{}, source int) (count int, err error) {
  151. o := orm.NewOrm()
  152. sql := ``
  153. tableName := GetEdbDataTableName(source)
  154. sql = ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
  155. sql = fmt.Sprintf(sql, tableName)
  156. if condition != "" {
  157. sql += condition
  158. }
  159. err = o.Raw(sql, pars).QueryRow(&count)
  160. return
  161. }
  162. // GetLastEdbData 获取最近的一条指标数据
  163. func GetLastEdbData(condition string, pars []interface{}, source int) (item *EdbInfoSearchData, err error) {
  164. o := orm.NewOrm()
  165. sql := ``
  166. tableName := GetEdbDataTableName(source)
  167. sql = ` SELECT * FROM %s WHERE 1=1 `
  168. sql = fmt.Sprintf(sql, tableName)
  169. if condition != "" {
  170. sql += condition
  171. }
  172. sql += ` ORDER BY data_time DESC `
  173. err = o.Raw(sql, pars).QueryRow(&item)
  174. return
  175. }
  176. // GetEdbInfoByEdbCode 根据指标code获取指标信息
  177. func GetEdbInfoByEdbCode(source int, edbCode string) (item *EdbInfo, err error) {
  178. o := orm.NewOrm()
  179. sql := ` SELECT * FROM edb_info WHERE source=? AND edb_code=? `
  180. err = o.Raw(sql, source, edbCode).QueryRow(&item)
  181. return
  182. }
  183. // GetEdbInfoOnlyByEdbCode 仅根据指标code获取指标信息
  184. func GetEdbInfoOnlyByEdbCode(edbCode string) (item *EdbInfo, err error) {
  185. o := orm.NewOrm()
  186. sql := ` SELECT * FROM edb_info WHERE edb_code=? `
  187. err = o.Raw(sql, edbCode).QueryRow(&item)
  188. return
  189. }
  190. // GetEdbInfoCalculateListByCondition 获取指标关系列表
  191. func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (items []*EdbInfoCalculateMapping, err error) {
  192. o := orm.NewOrm()
  193. sql := ` SELECT * FROM edb_info_calculate_mapping WHERE 1=1 `
  194. if condition != "" {
  195. sql += condition
  196. }
  197. _, err = o.Raw(sql, pars).QueryRows(&items)
  198. return
  199. }
  200. // GetEdbInfoCalculateCountByCondition 获取关联指标数量
  201. func GetEdbInfoCalculateCountByCondition(condition string, pars []interface{}) (count int, err error) {
  202. o := orm.NewOrm()
  203. sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_mapping WHERE 1=1 `
  204. if condition != "" {
  205. sql += condition
  206. }
  207. err = o.Raw(sql, pars).QueryRow(&count)
  208. return
  209. }
  210. //优化版本-处理数据精度问题
  211. type EdbInfoSearchDataV1 struct {
  212. EdbDataId int `description:"数据ID"`
  213. DataTime string `description:"数据日期"`
  214. Value string `description:"数据"`
  215. }
  216. //优化版本-处理数据精度问题
  217. func GetEdbDataListAllV1(condition string, pars []interface{}, source, order int) (item []*EdbInfoSearchDataV1, err error) {
  218. o := orm.NewOrm()
  219. sql := ``
  220. tableName := GetEdbDataTableName(source)
  221. sql = ` SELECT * FROM %s WHERE 1=1 `
  222. sql = fmt.Sprintf(sql, tableName)
  223. if condition != "" {
  224. sql += condition
  225. }
  226. if order == 1 {
  227. sql += ` ORDER BY data_time ASC `
  228. } else {
  229. sql += ` ORDER BY data_time DESC `
  230. }
  231. _, err = o.Raw(sql, pars).QueryRows(&item)
  232. return
  233. }
  234. // GetEdbInfoByCondition 获取指标列表
  235. func GetEdbInfoByCondition(condition string, pars []interface{}, order int) (item []*EdbInfo, err error) {
  236. o := orm.NewOrm()
  237. sql := ` SELECT * FROM edb_info WHERE 1=1 `
  238. if condition != "" {
  239. sql += condition
  240. }
  241. if order == 1 {
  242. sql += ` ORDER BY end_date ASC `
  243. } else {
  244. sql += ` ORDER BY edb_info_id ASC `
  245. }
  246. _, err = o.Raw(sql, pars).QueryRows(&item)
  247. return
  248. }
  249. // UnifiedModifyEdbInfoMaxAndMinInfo 统一修改指标的最大最小值
  250. func UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo *EdbInfo) (err error, errMsg string) {
  251. // 修改最大最小值
  252. maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(edbInfo.Source, edbInfo.EdbCode)
  253. if err != nil {
  254. if err.Error() == utils.ErrNoRow() {
  255. err = nil
  256. return
  257. }
  258. errMsg = "刷新指标失败!"
  259. err = errors.New("获取指标最大最小值失败,err:" + err.Error())
  260. return
  261. }
  262. if maxAndMinItem != nil {
  263. err = ModifyEdbInfoMaxAndMinInfo(edbInfo.EdbInfoId, maxAndMinItem)
  264. if err != nil {
  265. errMsg = "刷新指标失败!"
  266. err = errors.New("修改指标最大最小值失败,err:" + err.Error())
  267. return
  268. }
  269. }
  270. // 修改关联的预测指标
  271. go ModifyPredictEdbInfoMaxAndMinInfoBySourceEdbInfoId(edbInfo.EdbInfoId, maxAndMinItem)
  272. return
  273. }
  274. // GetChartPredictEdbInfoDataList 获取图表的预测指标的未来数据
  275. func GetChartPredictEdbInfoDataList(predictEdbConf PredictEdbConf, latestDateStr string, lastDataValue float64, endDateStr, frequency string, order int) (predictEdbInfoData []*EdbInfoSearchData, err error) {
  276. endDate, err := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
  277. if err != nil {
  278. return
  279. }
  280. latestDate, err := time.ParseInLocation(utils.FormatDate, latestDateStr, time.Local)
  281. if err != nil {
  282. return
  283. }
  284. // 开始预测数据的时间
  285. startDate := latestDate
  286. dataValue := lastDataValue
  287. if predictEdbConf.RuleType == 2 {
  288. dataValue = predictEdbConf.FixedValue
  289. }
  290. //获取后面的预测数据
  291. dayList := getPredictEdbDayList(startDate, endDate, frequency)
  292. predictEdbInfoData = make([]*EdbInfoSearchData, 0)
  293. // order:1升序,其余值为降序
  294. if order == 1 {
  295. for k, v := range dayList {
  296. predictEdbInfoData = append(predictEdbInfoData, &EdbInfoSearchData{
  297. EdbDataId: predictEdbConf.PredictEdbInfoId + 10000000000 + k,
  298. DataTime: v.Format(utils.FormatDate),
  299. Value: dataValue,
  300. })
  301. }
  302. } else {
  303. lenDayList := len(dayList)
  304. if lenDayList > 0 {
  305. for i := lenDayList - 1; i >= 0; i-- {
  306. v := dayList[i]
  307. predictEdbInfoData = append(predictEdbInfoData, &EdbInfoSearchData{
  308. EdbDataId: predictEdbConf.PredictEdbInfoId + 10000000000 + i,
  309. DataTime: v.Format(utils.FormatDate),
  310. Value: dataValue,
  311. })
  312. }
  313. }
  314. }
  315. return
  316. }
  317. // GetPredictEdbDayList 获取预测指标日期列表
  318. func getPredictEdbDayList(startDate, endDate time.Time, frequency string) (dayList []time.Time) {
  319. //if !utils.InArrayByStr([]string{"日度", "周度", "月度"}, frequency)
  320. switch frequency {
  321. case "日度":
  322. for currDate := startDate.AddDate(0, 0, 1); currDate.Before(endDate) || currDate.Equal(endDate); currDate = currDate.AddDate(0, 0, 1) {
  323. //周六、日排除
  324. if currDate.Weekday() == time.Sunday || currDate.Weekday() == time.Saturday {
  325. continue
  326. }
  327. dayList = append(dayList, currDate)
  328. }
  329. case "周度":
  330. //nextDate := startDate.AddDate(0, 0, 7)
  331. for currDate := startDate.AddDate(0, 0, 7); currDate.Before(endDate) || currDate.Equal(endDate); currDate = currDate.AddDate(0, 0, 7) {
  332. dayList = append(dayList, currDate)
  333. }
  334. case "月度":
  335. for currDate := startDate; currDate.Before(endDate) || currDate.Equal(endDate); {
  336. currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 2, -1)
  337. if !currDate.After(endDate) {
  338. dayList = append(dayList, currDate)
  339. }
  340. }
  341. }
  342. return
  343. }
  344. // GetPredictDataListByPredictEdbInfoId 根据预测指标id获取预测指标的数据,order:1升序,其余值为降序
  345. func GetPredictDataListByPredictEdbInfoId(edbInfoId, order int) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
  346. edbInfo, err := GetEdbInfoById(edbInfoId)
  347. if err != nil {
  348. errMsg = `获取预测指标信息失败`
  349. return
  350. }
  351. return GetPredictDataListByPredictEdbInfo(edbInfo, order)
  352. }
  353. // GetPredictDataListByPredictEdbInfo 根据预测指标信息获取预测指标的数据,order:1升序,其余值为降序
  354. func GetPredictDataListByPredictEdbInfo(edbInfo *EdbInfo, order int) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
  355. // 查找该预测指标配置
  356. predictEdbConf, err = GetPredictEdbConfById(edbInfo.EdbInfoId)
  357. if err != nil && err.Error() != utils.ErrNoRow() {
  358. errMsg = "获取预测指标配置信息失败"
  359. return
  360. }
  361. if predictEdbConf == nil {
  362. errMsg = "获取预测指标配置信息失败"
  363. err = errors.New(errMsg)
  364. return
  365. }
  366. // 来源指标
  367. sourceEdbInfoItem, err = GetEdbInfoById(predictEdbConf.SourceEdbInfoId)
  368. if err != nil {
  369. if err.Error() == utils.ErrNoRow() {
  370. errMsg = "找不到来源指标信息"
  371. err = errors.New(errMsg)
  372. }
  373. return
  374. }
  375. //获取指标数据(实际已生成)
  376. var condition string
  377. var pars []interface{}
  378. condition += " AND edb_info_id=? "
  379. pars = append(pars, sourceEdbInfoItem.EdbInfoId)
  380. dataList, err = GetEdbDataListAll(condition, pars, sourceEdbInfoItem.Source, order)
  381. if err != nil {
  382. return
  383. }
  384. // 获取预测指标未来的数据
  385. predictDataList := make([]*EdbInfoSearchData, 0)
  386. endDateStr := edbInfo.EndDate //预测指标的结束日期
  387. predictDataList, err = GetChartPredictEdbInfoDataList(*predictEdbConf, sourceEdbInfoItem.LatestDate, sourceEdbInfoItem.LatestValue, endDateStr, edbInfo.Frequency, order)
  388. if err != nil {
  389. return
  390. }
  391. dataList = append(dataList, predictDataList...)
  392. if len(predictDataList) > 0 {
  393. tmpValue := predictDataList[0]
  394. // 如果最大值 小于 预测值,那么将预测值作为最大值数据返回
  395. if edbInfo.MaxValue < tmpValue.Value {
  396. edbInfo.MaxValue = tmpValue.Value
  397. }
  398. // 如果最小值 大于 预测值,那么将预测值作为最小值数据返回
  399. if edbInfo.MinValue > tmpValue.Value {
  400. edbInfo.MinValue = tmpValue.Value
  401. }
  402. }
  403. return
  404. }
  405. // GetPredictEdbDataListAll 获取该预测指标所有的数据 ,order:1升序,其余值为降序
  406. func GetPredictEdbDataListAll(edbInfo *EdbInfo, order int) (items []*EdbInfoSearchData, err error) {
  407. if edbInfo.Source == utils.DATA_SOURCE_PREDICT { //普通的预测指标是没有入库数据的,直接往配置里面获取
  408. items, _, _, err, _ = GetPredictDataListByPredictEdbInfo(edbInfo, 1)
  409. } else {
  410. var condition string
  411. var pars []interface{}
  412. condition += " AND edb_info_id=? "
  413. pars = append(pars, edbInfo.EdbInfoId)
  414. items, err = GetEdbDataListAll(condition, pars, edbInfo.Source, order)
  415. }
  416. return
  417. }