query.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. package edb_data
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_yb/global"
  6. "hongze/hongze_yb/models/mgo"
  7. "hongze/hongze_yb/models/tables/chart_edb_mapping"
  8. "hongze/hongze_yb/models/tables/edb_source"
  9. "hongze/hongze_yb/utils"
  10. "strconv"
  11. "time"
  12. "go.mongodb.org/mongo-driver/bson"
  13. )
  14. // GetEdbDataTableName 指标数据->存储表
  15. func GetEdbDataTableName(source, subSource int) (tableName string) {
  16. switch source {
  17. case utils.DATA_SOURCE_THS:
  18. switch subSource {
  19. case utils.DATA_SUB_SOURCE_DATE:
  20. tableName = "edb_data_ths_ds"
  21. case utils.DATA_SUB_SOURCE_HIGH_FREQUENCY:
  22. tableName = "edb_data_ths_hf"
  23. default:
  24. tableName = "edb_data_ths"
  25. }
  26. case utils.DATA_SOURCE_WIND:
  27. if subSource == utils.DATA_SUB_SOURCE_DATE {
  28. tableName = "edb_data_wind_wsd"
  29. } else {
  30. tableName = "edb_data_wind"
  31. }
  32. case utils.DATA_SOURCE_PB, utils.DATA_SOURCE_PB_FINANCE: //彭博经济数据、彭博财务数据
  33. tableName = "edb_data_pb"
  34. case utils.DATA_SOURCE_CALCULATE:
  35. tableName = "edb_data_calculate"
  36. case utils.DATA_SOURCE_CALCULATE_LJZZY:
  37. tableName = "edb_data_calculate_ljzzy"
  38. case utils.DATA_SOURCE_CALCULATE_TBZ:
  39. tableName = "edb_data_calculate_tbz"
  40. case utils.DATA_SOURCE_CALCULATE_TCZ:
  41. tableName = "edb_data_calculate_tcz"
  42. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
  43. tableName = "edb_data_calculate_nszydpjjs"
  44. case utils.DATA_SOURCE_MANUAL:
  45. tableName = "edb_data_manual"
  46. case utils.DATA_SOURCE_LZ:
  47. tableName = "edb_data_lz"
  48. case utils.DATA_SOURCE_YS:
  49. tableName = "edb_data_ys"
  50. case utils.DATA_SOURCE_CALCULATE_HBZ:
  51. tableName = "edb_data_calculate_hbz"
  52. case utils.DATA_SOURCE_CALCULATE_HCZ:
  53. tableName = "edb_data_calculate_hcz"
  54. case utils.DATA_SOURCE_CALCULATE_BP:
  55. tableName = "edb_data_calculate_bp"
  56. case utils.DATA_SOURCE_GL:
  57. tableName = "edb_data_gl"
  58. case utils.DATA_SOURCE_ZZ:
  59. tableName = "edb_data_zz"
  60. case utils.DATA_SOURCE_DL:
  61. tableName = "edb_data_dl"
  62. case utils.DATA_SOURCE_SH:
  63. tableName = "edb_data_sh"
  64. case utils.DATA_SOURCE_CFFEX:
  65. tableName = "edb_data_cffex"
  66. case utils.DATA_SOURCE_SHFE:
  67. tableName = "edb_data_ine"
  68. case utils.DATA_SOURCE_GIE:
  69. tableName = "edb_data_gie"
  70. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  71. tableName = "edb_data_calculate_zjpj"
  72. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  73. tableName = "edb_data_calculate_time_shift"
  74. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
  75. tableName = "edb_data_calculate_ljztbpj"
  76. case utils.DATA_SOURCE_LT:
  77. tableName = "edb_data_lt"
  78. case utils.DATA_SOURCE_COAL:
  79. tableName = "edb_data_coal"
  80. case utils.DATA_SOURCE_PYTHON:
  81. tableName = "edb_data_python"
  82. case utils.DATA_SOURCE_GOOGLE_TRAVEL:
  83. tableName = "edb_data_google_travel"
  84. case utils.DATA_SOURCE_PREDICT_CALCULATE:
  85. tableName = "edb_data_predict_calculate"
  86. case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ:
  87. tableName = "edb_data_predict_calculate_tbz"
  88. case utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ:
  89. tableName = "edb_data_predict_calculate_tcz"
  90. case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
  91. tableName = "edb_data_mysteel_chemical"
  92. case utils.DATA_SOURCE_CALCULATE_CJJX:
  93. tableName = "edb_data_calculate_cjjx"
  94. case utils.DATA_SOURCE_EIA_STEO:
  95. tableName = "edb_data_eia_steo"
  96. case utils.DATA_SOURCE_CALCULATE_NHCC:
  97. tableName = "edb_data_calculate_nhcc"
  98. case utils.DATA_SOURCE_COM_TRADE:
  99. tableName = "edb_data_com_trade"
  100. case utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS:
  101. tableName = "edb_data_predict_calculate_nszydpjjs"
  102. case utils.DATA_SOURCE_CALCULATE_ADJUST:
  103. tableName = "edb_data_calculate_adjust"
  104. case utils.DATA_SOURCE_SCI:
  105. tableName = "edb_data_sci"
  106. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY:
  107. tableName = "edb_data_predict_calculate_ljzzy"
  108. case utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
  109. tableName = "edb_data_predict_calculate_time_shift"
  110. case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ:
  111. tableName = "edb_data_predict_calculate_zjpj"
  112. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ:
  113. tableName = "edb_data_predict_calculate_ljztbpj"
  114. case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC:
  115. tableName = "edb_data_predict_calculate_nhcc"
  116. case utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX:
  117. tableName = "edb_data_predict_calculate_cjjx"
  118. case utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ:
  119. tableName = "edb_data_predict_calculate_hbz"
  120. case utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ:
  121. tableName = "edb_data_predict_calculate_hcz"
  122. case utils.DATA_SOURCE_PREDICT_CALCULATE_BP:
  123. tableName = "edb_data_predict_calculate_bp"
  124. case utils.DATA_SOURCE_CALCULATE_JP:
  125. tableName = "edb_data_calculate_jp"
  126. case utils.DATA_SOURCE_CALCULATE_NH:
  127. tableName = "edb_data_calculate_nh"
  128. case utils.DATA_SOURCE_CALCULATE_KSZS:
  129. tableName = "edb_data_calculate_kszs"
  130. case utils.DATA_SOURCE_PREDICT_CALCULATE_JP:
  131. tableName = "edb_data_predict_calculate_jp"
  132. case utils.DATA_SOURCE_PREDICT_CALCULATE_NH:
  133. tableName = "edb_data_predict_calculate_nh"
  134. case utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS:
  135. tableName = "edb_data_predict_calculate_kszs"
  136. case utils.DATA_SOURCE_BAIINFO:
  137. tableName = "edb_data_baiinfo"
  138. case utils.DATA_SOURCE_STOCK_PLANT:
  139. tableName = "edb_data_stock_plant"
  140. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  141. tableName = "edb_data_calculate_correlation"
  142. case utils.DATA_SOURCE_NATIONAL_STATISTICS:
  143. tableName = "edb_data_national_statistics"
  144. case utils.DATA_SOURCE_CALCULATE_LJZZJ: //累计值转季 -> 61
  145. tableName = "edb_data_calculate_ljzzj"
  146. case utils.DATA_SOURCE_CALCULATE_LJZ: //累计值 -> 62
  147. tableName = "edb_data_calculate_ljz"
  148. case utils.DATA_SOURCE_CALCULATE_LJZNCZJ: //累计值(年初至今) -> 63
  149. tableName = "edb_data_calculate_ljznczj"
  150. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZJ: // 预测指标 - 累计值 -> 65
  151. tableName = "edb_data_predict_calculate_ljzzj"
  152. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZ: //预测指标 - 累计值转季->64
  153. tableName = "edb_data_predict_calculate_ljz"
  154. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ: //预测指标 - 累计值(年初至今) -> 66
  155. tableName = "edb_data_predict_calculate_ljznczj"
  156. case utils.DATA_SOURCE_CALCULATE_STANDARD_DEVIATION: //标准差->67
  157. tableName = "edb_data_calculate_standard_deviation"
  158. case utils.DATA_SOURCE_CALCULATE_PERCENTILE: //百分位->68
  159. tableName = "edb_data_calculate_percentile"
  160. case utils.DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION: //预测标准差->69
  161. tableName = "edb_data_predict_ccalculate_standard_deviation"
  162. case utils.DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE: //预测百分位->70
  163. tableName = "edb_data_predict_ccalculate_percentile"
  164. case utils.DATA_SOURCE_FUBAO: //富宝 -> 71
  165. tableName = "edb_data_fubao"
  166. case utils.DATA_SOURCE_CALCULATE_ZSXY:
  167. tableName = "edb_data_calculate_zsxy" // 指数修匀->72
  168. case utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
  169. tableName = "edb_data_predict_calculate_zsxy" // 预测指数修匀->73
  170. case utils.DATA_SOURCE_CALCULATE_ZDYFX:
  171. tableName = "edb_data_calculate_zdyfx" // 自定义分析->74
  172. case utils.DATA_SOURCE_CALCULATE_RJZ: //日均值->75
  173. tableName = "edb_data_calculate_rjz"
  174. case utils.DATA_SOURCE_PREDICT: // 基础预测指标->30
  175. tableName = "edb_data_predict_base"
  176. default:
  177. edbSource, _ := edb_source.GetEdbSourceBySource(source)
  178. if edbSource != nil {
  179. tableName = edbSource.TbName
  180. }
  181. }
  182. return
  183. }
  184. type EdbDataList struct {
  185. EdbDataId int `description:" 指标数据ID"`
  186. EdbInfoId int `description:"指标ID"`
  187. DataTime string `json:"-" description:"数据日期"`
  188. DataTimestamp int64 `description:"数据日期"`
  189. Value float64 `description:"数据值"`
  190. }
  191. type EdbDataItems struct {
  192. Items []*EdbDataList
  193. Year int
  194. BetweenDay int `json:"-" description:"公历与农历之间相差的天数"`
  195. CuttingDataTimestamp int64 `description:"切割的时间戳"`
  196. }
  197. type EdbDataResult struct {
  198. List []*EdbDataItems
  199. }
  200. type QuarterData struct {
  201. Year string
  202. DataList []*EdbDataList
  203. CuttingDataTimestamp int64 `description:"切割的时间戳"`
  204. ChartLegend string
  205. Years string
  206. }
  207. type QuarterXDateItem struct {
  208. StartDate time.Time
  209. EndDate time.Time
  210. ShowName string
  211. ChartLegend string
  212. CuttingDataTimestamp int64 `description:"切割的时间戳"`
  213. }
  214. type SeasonExtraItem struct {
  215. ChartLegend []SeasonChartLegend `description:"自定义的图例名称"`
  216. XStartDate string `description:"横坐标显示的起始日"`
  217. XEndDate string `description:"横坐标显示的截止日"`
  218. JumpYear int `description:"横坐标日期是否跨年,1跨年,0不跨年"`
  219. RightAxis SeasonRightAxis `description:"自定义右轴指标"`
  220. MaxMinLimits MaxMinLimits `description:"自定义同期上下限"`
  221. SamePeriodAverage SamePeriodAverage `description:"自定义同期均线"`
  222. SamePeriodStandardDeviation SamePeriodStandardDeviation `description:"自定义同期标准差"`
  223. }
  224. type SeasonChartLegend struct {
  225. Name string
  226. Value string
  227. }
  228. type QuarterDataList []*QuarterData
  229. func (m QuarterDataList) Len() int {
  230. return len(m)
  231. }
  232. func (m QuarterDataList) Less(i, j int) bool {
  233. return m[i].Years < m[j].Years
  234. }
  235. func (m QuarterDataList) Swap(i, j int) {
  236. m[i], m[j] = m[j], m[i]
  237. }
  238. // GetEdbDataList 获取指标数据
  239. func GetEdbDataList(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
  240. // 自有数据需要额外处理(从mongo获取)
  241. if source == utils.DATA_SOURCE_BUSINESS && global.CONFIG.Serve.UseMongo {
  242. return getEdbDataListByMongo(source, subSource, edbInfoId, startDate, endDate)
  243. }
  244. if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && global.CONFIG.Serve.UseMongo {
  245. return getThsHfEdbDataListByMongo(source, subSource, edbInfoId, startDate, endDate)
  246. }
  247. return getEdbDataListByMysql(source, subSource, edbInfoId, startDate, endDate)
  248. }
  249. // getEdbDataListByMysql
  250. // @Description: 通过mysql查询指标数据
  251. // @author: Roc
  252. // @datetime 2024-05-08 17:52:21
  253. // @param source int
  254. // @param subSource int
  255. // @param edbInfoId int
  256. // @param startDate string
  257. // @param endDate string
  258. // @return list []*EdbDataList
  259. // @return err error
  260. func getEdbDataListByMysql(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
  261. tableName := GetEdbDataTableName(source, subSource)
  262. if tableName == "" {
  263. err = errors.New("无效的渠道:" + strconv.Itoa(source))
  264. list = make([]*EdbDataList, 0)
  265. return list, err
  266. }
  267. var pars []interface{}
  268. pars = append(pars, edbInfoId)
  269. sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id = ? `
  270. if startDate != "" {
  271. sql += ` AND data_time >= ? `
  272. pars = append(pars, startDate)
  273. }
  274. if endDate != "" {
  275. sql += ` AND data_time <= ? `
  276. pars = append(pars, endDate)
  277. }
  278. sql += ` ORDER BY data_time ASC `
  279. sql = fmt.Sprintf(sql, tableName)
  280. err = global.MYSQL["data"].Raw(sql, pars...).Scan(&list).Error
  281. // 格式化日期
  282. if len(list) > 0 {
  283. for _, row := range list {
  284. if row.DataTime != "" {
  285. row.DataTime = row.DataTime[:10] // 此处获取的字符串row.DataTime长度有长有短,截取年月日
  286. //tempTime, _ := time.Parse("2006-01-02T00:00:00+08:00", row.DataTime)
  287. //row.DataTime = tempTime.Format(utils.FormatDate)
  288. }
  289. }
  290. }
  291. return
  292. }
  293. // getEdbDataListByMongo
  294. // @Description: 通过mongo查询指标数据
  295. // @author: Roc
  296. // @datetime 2024-05-07 10:40:43
  297. // @param source int
  298. // @param subSource int
  299. // @param endInfoId int
  300. // @param startDate string
  301. // @param endDate string
  302. // @return list []*EdbDataList
  303. // @return err error
  304. func getEdbDataListByMongo(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
  305. list = make([]*EdbDataList, 0)
  306. mogDataObj := mgo.EdbDataBusiness{}
  307. // 构建查询条件
  308. queryConditions := bson.M{
  309. "edb_info_id": edbInfoId,
  310. }
  311. // 日期
  312. dateCondition, err := mgo.BuildDateCondition(startDate, endDate)
  313. if err != nil {
  314. return
  315. }
  316. if len(dateCondition) > 0 {
  317. queryConditions["data_time"] = dateCondition
  318. }
  319. // 获取列表数据
  320. tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"data_time"})
  321. if tmpErr != nil {
  322. err = tmpErr
  323. return
  324. }
  325. for k, v := range tmpDataList {
  326. list = append(list, &EdbDataList{
  327. EdbDataId: k + 1,
  328. EdbInfoId: v.EdbInfoId,
  329. DataTime: v.DataTime.Format(utils.FormatDate),
  330. DataTimestamp: v.DataTimestamp,
  331. Value: v.Value,
  332. })
  333. }
  334. return
  335. }
  336. func getThsHfEdbDataListByMongo(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
  337. list = make([]*EdbDataList, 0)
  338. mogDataObj := mgo.EdbDataThsHf{}
  339. // 构建查询条件
  340. queryConditions := bson.M{
  341. "edb_info_id": edbInfoId,
  342. }
  343. // 日期
  344. dateCondition, err := mgo.BuildDateCondition(startDate, endDate)
  345. if err != nil {
  346. return
  347. }
  348. if len(dateCondition) > 0 {
  349. queryConditions["data_time"] = dateCondition
  350. }
  351. // 获取列表数据
  352. tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"data_time"})
  353. if tmpErr != nil {
  354. err = tmpErr
  355. return
  356. }
  357. for k, v := range tmpDataList {
  358. list = append(list, &EdbDataList{
  359. EdbDataId: k + 1,
  360. EdbInfoId: v.EdbInfoId,
  361. DataTime: v.DataTime.Format(utils.FormatDate),
  362. DataTimestamp: v.DataTimestamp,
  363. Value: v.Value,
  364. })
  365. }
  366. return
  367. }
  368. // 自定义同期均线
  369. type SamePeriodAverageResp struct {
  370. Color string `description:"颜色"`
  371. Year int `description:"均线取值范围"`
  372. Legend string `description:"图例名称"`
  373. LineType string `description:"线型"`
  374. LineWidth float64 `description:"线宽"`
  375. IsShow bool `description:"是否显示"`
  376. List []*SamePeriodAverageData `description:"自定义均线列表"`
  377. IsAdd bool `description:"是否添加"`
  378. }
  379. type SamePeriodAverageData struct {
  380. DataTime string `description:"数据日期"`
  381. DataTimestamp int64 `description:"数据日期时间戳"`
  382. Value float64 `description:"均值"`
  383. }
  384. // 自定义同期标准差
  385. type SamePeriodStandardDeviation struct {
  386. Color string `description:"颜色"`
  387. Year int `description:"标准差取值范围"`
  388. Legend string `description:"图例名称"`
  389. Multiple float64 `description:"标准差倍数"`
  390. IsShow bool `description:"是否显示"`
  391. IsAdd bool `description:"是否添加"`
  392. }
  393. type SamePeriodStandardDeviationResp struct {
  394. Color string `description:"颜色"`
  395. Year int `description:"标准差取值范围"`
  396. Legend string `description:"图例名称"`
  397. Multiple float64 `description:"标准差倍数"`
  398. IsShow bool `description:"是否显示"`
  399. List []*MaxMinLimitsData `description:"自定义标准差列表"`
  400. IsAdd bool `description:"是否添加"`
  401. }
  402. type SeasonChartResp struct {
  403. MaxMinLimits MaxMinLimitsResp `description:"自定义上下限"`
  404. SamePeriodAverage SamePeriodAverageResp `description:"自定义同期均线"`
  405. SamePeriodStandardDeviation SamePeriodStandardDeviationResp `description:"自定义同期标准差线"`
  406. RightAxis SeasonRightAxisResp `description:"自定义右轴指标"`
  407. }
  408. // 自定义右轴指标
  409. type SeasonRightAxisResp struct {
  410. SeasonRightAxis
  411. EdbInfoList []*chart_edb_mapping.ChartEdbInfoMappingList
  412. }
  413. type MaxMinLimitsResp struct {
  414. List []*MaxMinLimitsData `description:"自定义上下限列表"`
  415. Color string `description:"颜色"`
  416. Year int `description:"上下限取值范围"`
  417. Legend string `description:"图例名称"`
  418. IsShow bool `description:"是否显示"`
  419. IsAdd bool `description:"是否添加"`
  420. }
  421. type MaxMinLimitsData struct {
  422. DataTime string `description:"数据日期"`
  423. DataTimestamp int64 `description:"数据日期时间戳"`
  424. MaxValue float64 `description:"最大值"`
  425. MinValue float64 `description:"最小值"`
  426. }
  427. // 自定义右轴指标
  428. type SeasonRightAxis struct {
  429. IndicatorType int `description:"右轴指标类型 1:左轴指标同比,2:指标库,3:预测指标 "`
  430. Style string `description:"生成样式"`
  431. Shape string `description:"形状"`
  432. ChartColor string `description:"图表颜色"`
  433. Size float64 `description:"大小"`
  434. Legend string `description:"图例名称"`
  435. NumFormat int `description:"数值格式 1:百分比 2:小数"`
  436. IsConnected int `description:"是否连接 0不连接 1连接"`
  437. LineColor string `description:"线条颜色"`
  438. LineWidth float64 `description:"线条宽度"`
  439. LineStyle string `description:"线条样式"`
  440. IsShow bool `description:"是否显示"`
  441. IsAdd bool `description:"是否添加"`
  442. }
  443. // 自定义同期上下限
  444. type MaxMinLimits struct {
  445. Color string `description:"颜色"`
  446. Year int `description:"上下限取值范围"`
  447. Legend string `description:"图例名称"`
  448. IsShow bool `description:"是否显示"`
  449. IsAdd bool `description:"是否添加"`
  450. }
  451. // 自定义同期均线
  452. type SamePeriodAverage struct {
  453. Color string `description:"颜色"`
  454. Year int `description:"均线取值范围"`
  455. Legend string `description:"图例名称"`
  456. LineType string `description:"线型"`
  457. LineWidth float64 `description:"线宽"`
  458. IsShow bool `description:"是否显示"`
  459. IsAdd bool `description:"是否添加"`
  460. }