chart_common.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_chart_lib/models"
  5. "eta/eta_chart_lib/models/data_manage"
  6. cross_varietyReq "eta/eta_chart_lib/models/data_manage/cross_variety/request"
  7. "eta/eta_chart_lib/models/data_manage/future_good"
  8. "eta/eta_chart_lib/models/data_manage/future_good/request"
  9. "eta/eta_chart_lib/models/data_manage/future_good/response"
  10. line_equationReq "eta/eta_chart_lib/models/data_manage/line_equation/request"
  11. line_featureReq "eta/eta_chart_lib/models/data_manage/line_feature/request"
  12. "eta/eta_chart_lib/services/data"
  13. correlationServ "eta/eta_chart_lib/services/data/correlation"
  14. "eta/eta_chart_lib/services/data/cross_variety"
  15. future_goodServ "eta/eta_chart_lib/services/data/future_good"
  16. "eta/eta_chart_lib/services/data/line_equation"
  17. lineFeatureServ "eta/eta_chart_lib/services/data/line_feature"
  18. dwmini "eta/eta_chart_lib/services/dw_mini"
  19. "eta/eta_chart_lib/utils"
  20. "fmt"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. // CommonChartInfoDetailFromUniqueCode
  26. // @Title 根据编码获取图表详情
  27. // @Description 根据编码获取图表详情接口
  28. // @Param UniqueCode query int true "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
  29. // @Param IsCache query bool true "是否走缓存,默认false"
  30. // @Param Token query string true "东吴小程序token"
  31. // @Param Source query int true "查询来源 1:东吴"
  32. // @Success 200 {object} data_manage.ChartInfoDetailFromUniqueCodeResp
  33. // @router /common/detail [get]
  34. func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
  35. br := new(models.BaseResponse).Init()
  36. defer func() {
  37. this.Data["json"] = br
  38. this.ServeJSON()
  39. }()
  40. uniqueCode := this.GetString("UniqueCode")
  41. token := this.GetString("Token")
  42. source, _ := this.GetInt("Source")
  43. if uniqueCode == "" {
  44. br.Msg = "参数错误"
  45. br.ErrMsg = "参数错误,uniqueCode is empty"
  46. return
  47. }
  48. key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
  49. resp := new(models.ChartInfoDetailResp)
  50. // 图表水印
  51. conf, e := models.GetBusinessConf()
  52. if e != nil {
  53. br.Msg = "获取失败"
  54. br.ErrMsg = "获取配置信息失败, Err: " + e.Error()
  55. return
  56. }
  57. var isCollect bool
  58. if source == utils.CHART_SOURCE_DW && token != "" {
  59. tmpIsCollect, err := dwmini.GetMyChartIsCollect(token, uniqueCode)
  60. if err != nil {
  61. br.Msg = "获取失败"
  62. br.ErrMsg = "获取收藏状态失败,Err:" + err.Error()
  63. return
  64. }
  65. isCollect = tmpIsCollect
  66. }
  67. //判断是否有缓存
  68. if utils.Re == nil {
  69. if utils.Re == nil && utils.Rc.IsExist(key) {
  70. if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
  71. err := json.Unmarshal(data, &resp)
  72. if err == nil && resp != nil {
  73. if conf[models.BusinessConfWatermarkChart] == "true" && conf[models.BusinessConfCompanyWatermark] != "" {
  74. resp.WaterMark = conf[models.BusinessConfCompanyWatermark]
  75. }
  76. if isCollect {
  77. resp.IsCollect = isCollect
  78. }
  79. br.Ret = 200
  80. br.Success = true
  81. br.Msg = "获取成功"
  82. br.Data = resp
  83. fmt.Println("source redis")
  84. return
  85. }
  86. }
  87. }
  88. }
  89. chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
  90. if err != nil {
  91. if err.Error() == utils.ErrNoRow() {
  92. br.Msg = "该图已被删除,请刷新页面"
  93. br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
  94. return
  95. }
  96. br.Msg = "获取失败"
  97. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  98. return
  99. }
  100. //var resp interface{}
  101. var isOk bool
  102. var msg, errMsg string
  103. switch chartInfo.Source {
  104. case utils.CHART_SOURCE_DEFAULT:
  105. resp, isOk, msg, errMsg = GetChartInfoDetailFromUniqueCode(chartInfo, key)
  106. case utils.CHART_SOURCE_FUTURE_GOOD:
  107. resp, isOk, msg, errMsg = GetFutureGoodChartInfoDetailFromUniqueCode(chartInfo, key)
  108. case utils.CHART_SOURCE_FUTURE_GOOD_PROFIT:
  109. resp, isOk, msg, errMsg = GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo, key)
  110. case utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION:
  111. resp, isOk, msg, errMsg = GetCorrelationChartInfoDetailFromUniqueCode(chartInfo, key)
  112. case utils.CHART_SOURCE_LINE_EQUATION:
  113. resp, isOk, msg, errMsg = GetLineEquationChartInfoDetailFromUniqueCode(chartInfo, key)
  114. case utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
  115. resp, isOk, msg, errMsg = GetLineFeatureChartInfoDetailFromUniqueCode(chartInfo, key)
  116. case utils.CHART_SOURCE_CROSS_HEDGING:
  117. resp, isOk, msg, errMsg = GetCrossVarietyChartInfoDetailFromUniqueCode(chartInfo, key)
  118. default:
  119. br.Msg = "错误的图表"
  120. br.ErrMsg = "错误的图表"
  121. return
  122. }
  123. if !isOk {
  124. br.Msg = msg
  125. br.ErrMsg = errMsg
  126. return
  127. }
  128. if isCollect {
  129. resp.IsCollect = isCollect
  130. }
  131. if conf[models.BusinessConfWatermarkChart] == "true" && conf[models.BusinessConfCompanyWatermark] != "" {
  132. resp.WaterMark = conf[models.BusinessConfCompanyWatermark]
  133. }
  134. br.Ret = 200
  135. br.Success = true
  136. br.Msg = "获取成功"
  137. br.Data = resp
  138. }
  139. // GetFutureGoodChartInfoDetailFromUniqueCode 根据编码获取图表详情
  140. func GetFutureGoodChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  141. resp = new(models.ChartInfoDetailResp)
  142. // 获取主题样式
  143. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
  144. if err != nil {
  145. msg = "获取失败"
  146. errMsg = "获取主题信息失败,Err:" + err.Error()
  147. return
  148. }
  149. chartInfo.ChartThemeStyle = chartTheme.Config
  150. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  151. chartInfoId := chartInfo.ChartInfoId
  152. startDate := chartInfo.StartDate
  153. endDate := chartInfo.EndDate
  154. // 兼容日期错误
  155. {
  156. if strings.Count(startDate, "-") == 1 {
  157. startDate = startDate + "-01"
  158. }
  159. if strings.Count(endDate, "-") == 1 {
  160. endDate = endDate + "-01"
  161. }
  162. }
  163. edbInfoMapping, err := models.GetEtaEdbChartEdbMapping(chartInfoId)
  164. if err != nil {
  165. msg = "获取失败"
  166. errMsg = "获取图表,现货指标信息失败,Err:" + err.Error()
  167. return
  168. }
  169. futureGoodEdbInfoMapping, err := models.GetFutureGoodEdbChartEdbMapping(chartInfoId)
  170. if err != nil {
  171. msg = "获取失败"
  172. errMsg = "获取图表的期货商品指标信息失败,Err:" + err.Error()
  173. return
  174. }
  175. // 商品价格曲线图的一些配置
  176. var barConfig data_manage.BarChartInfoReq
  177. barChartInfoDateList := make([]data_manage.BarChartInfoDateReq, 0)
  178. //barChartInfoSort := data_manage.BarChartInfoSortReq{}
  179. if chartInfo.BarConfig == `` {
  180. msg = "商品价格曲线图未配置"
  181. errMsg = "商品价格曲线图未配置"
  182. return
  183. }
  184. err = json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  185. if err != nil {
  186. msg = "商品价格曲线图配置异常"
  187. errMsg = "商品价格曲线图配置异常"
  188. return
  189. }
  190. barChartInfoDateList = barConfig.DateList
  191. //barChartInfoSort = barConfig.Sort
  192. // 获取图表中的指标数据
  193. barConfigEdbInfoIdList, edbList, xEdbIdValue, xDataList, yDataList, err := future_goodServ.GetChartEdbData(chartInfoId, startDate, endDate, edbInfoMapping, futureGoodEdbInfoMapping, barChartInfoDateList)
  194. if err != nil {
  195. msg = "获取失败"
  196. errMsg = "获取图表,指标信息失败,Err:" + err.Error()
  197. return
  198. }
  199. warnEdbList := make([]string, 0)
  200. if len(edbList) <= 0 {
  201. msg = "商品价格曲线图表指标异常"
  202. errMsg = "商品价格曲线图表异常"
  203. return
  204. }
  205. baseEdbInfo := edbList[0] //现货指标
  206. for _, v := range edbList {
  207. if v.IsNullData {
  208. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  209. }
  210. // 指标别名
  211. if barConfigEdbInfoIdList != nil && len(barConfigEdbInfoIdList) > 0 {
  212. for _, reqEdb := range barConfigEdbInfoIdList {
  213. if v.EdbInfoId == reqEdb.EdbInfoId {
  214. v.EdbAliasName = reqEdb.Name
  215. v.EdbAliasNameEn = reqEdb.NameEn
  216. }
  217. }
  218. }
  219. }
  220. chartInfo.UnitEn = baseEdbInfo.UnitEn
  221. // 图表的指标来源
  222. sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
  223. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  224. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  225. resp.ChartInfo = chartInfo
  226. resp.EdbInfoList = edbList
  227. resp.XEdbIdValue = xEdbIdValue
  228. resp.YDataList = yDataList
  229. resp.XDataList = xDataList
  230. //resp.BarChartInfo = barConfig
  231. //resp.Status = true
  232. // 将数据加入缓存
  233. if utils.Re == nil {
  234. data, _ := json.Marshal(resp)
  235. utils.Rc.Put(key, data, 2*time.Hour)
  236. }
  237. isOk = true
  238. return
  239. }
  240. // GetFutureGoodProfitChartInfoDetailFromUniqueCode 根据编码获取商品利润图表详情
  241. func GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  242. resp = new(models.ChartInfoDetailResp)
  243. chartInfoId := chartInfo.ChartInfoId
  244. // 获取主题样式
  245. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
  246. if err != nil {
  247. msg = "获取失败"
  248. errMsg = "获取主题信息失败,Err:" + err.Error()
  249. return
  250. }
  251. chartInfo.ChartThemeStyle = chartTheme.Config
  252. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  253. // 商品利润曲线图的一些配置
  254. var extraConf request.ChartInfoReq
  255. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConf)
  256. if err != nil {
  257. msg = "商品利润曲线图配置异常"
  258. errMsg = "商品利润曲线图配置异常,Err:" + err.Error()
  259. return
  260. }
  261. edbList := make([]*models.ChartEdbInfoMapping, 0)
  262. edbInfoMapping, err := models.GetEtaEdbChartEdbMapping(chartInfoId)
  263. if err != nil {
  264. msg = "获取失败"
  265. errMsg = "获取商品利润图表,基础指标信息失败,Err:" + err.Error()
  266. return
  267. }
  268. edbList = append(edbList, edbInfoMapping)
  269. futureGoodEdbInfoMappingList, err := models.GetFutureGoodEdbChartEdbMappingList(chartInfoId)
  270. if err != nil {
  271. msg = "获取失败"
  272. errMsg = "获取商品利润图表,商品指标信息失败,Err:" + err.Error()
  273. return
  274. }
  275. edbList = append(edbList, futureGoodEdbInfoMappingList...)
  276. if len(edbList) <= 0 {
  277. msg = "商品利润曲线图表指标异常"
  278. errMsg = "商品利润曲线图表指标异常"
  279. return
  280. }
  281. xDataList := make([]models.XData, 0)
  282. yDataList := make([]models.YData, 0)
  283. // 查找商品利润图表的扩展信息
  284. chartInfoFutureGoodProfit := new(future_good.ChartInfoFutureGoodProfit)
  285. if err = chartInfoFutureGoodProfit.GetItemById(chartInfo.ChartInfoId); err != nil {
  286. msg = "获取失败"
  287. errMsg = "获取基础相关性图表信息失败, Err: " + err.Error()
  288. return
  289. }
  290. err = json.Unmarshal([]byte(chartInfoFutureGoodProfit.XValue), &xDataList)
  291. if err != nil {
  292. msg = "获取失败"
  293. errMsg = "转换X轴数据失败, Err: " + err.Error()
  294. return
  295. }
  296. err = json.Unmarshal([]byte(chartInfoFutureGoodProfit.YValue), &yDataList)
  297. if err != nil {
  298. msg = "获取失败"
  299. errMsg = "转换Y轴数据失败, Err: " + err.Error()
  300. return
  301. }
  302. warnEdbList := make([]string, 0)
  303. baseEdbInfo := edbList[0] //现货指标
  304. for _, v := range edbList {
  305. if v.IsNullData {
  306. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  307. }
  308. }
  309. chartInfo.UnitEn = baseEdbInfo.UnitEn
  310. resp.ChartInfo = chartInfo
  311. resp.EdbInfoList = edbList
  312. resp.DataResp = response.ProfitFutureGoodChartResp{
  313. YDataList: yDataList,
  314. XDataList: xDataList,
  315. ProfitName: chartInfoFutureGoodProfit.ProfitName,
  316. ProfitNameEn: chartInfoFutureGoodProfit.ProfitNameEn,
  317. Extra: extraConf,
  318. }
  319. // 将数据加入缓存
  320. if utils.Re == nil {
  321. data, _ := json.Marshal(resp)
  322. utils.Rc.Put(key, data, 2*time.Hour)
  323. }
  324. isOk = true
  325. return
  326. }
  327. // GetLineEquationChartInfoDetailFromUniqueCode 根据编码获取拟合方程图表详情
  328. func GetLineEquationChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  329. resp = new(models.ChartInfoDetailResp)
  330. // 获取主题样式
  331. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
  332. if err != nil {
  333. msg = "获取失败"
  334. errMsg = "获取主题信息失败,Err:" + err.Error()
  335. return
  336. }
  337. chartInfo.ChartThemeStyle = chartTheme.Config
  338. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  339. //chartInfoId := chartInfo.ChartInfoId
  340. if chartInfo.ExtraConfig == `` {
  341. msg = "获取失败"
  342. errMsg = "获取配置信息失败"
  343. return
  344. }
  345. var lineChartInfoConfig line_equationReq.LineChartInfoReq
  346. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &lineChartInfoConfig)
  347. if err != nil {
  348. msg = "获取失败"
  349. errMsg = "获取图表配置信息失败, Err:" + err.Error()
  350. return
  351. }
  352. var getAData, getBData, getR2Data bool
  353. switch lineChartInfoConfig.Source {
  354. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_ONE:
  355. getAData = true
  356. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_TWO:
  357. getBData = true
  358. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_THREE:
  359. getR2Data = true
  360. }
  361. edbList, dataResp, err, errMsg := line_equation.GetChartEdbData(chartInfo.ChartInfoId, lineChartInfoConfig, getAData, getBData, getR2Data)
  362. if err != nil {
  363. if errMsg == `` {
  364. errMsg = "获取失败"
  365. }
  366. return
  367. }
  368. var resultResp interface{}
  369. switch lineChartInfoConfig.Source {
  370. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_ONE:
  371. resultResp = dataResp.AData
  372. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_TWO:
  373. resultResp = dataResp.BData
  374. case utils.CHART_MULTIPLE_GRAPH_LINE_EQUATION_THREE:
  375. resultResp = dataResp.R2Data
  376. }
  377. //chartInfo.UnitEn = baseEdbInfo.UnitEn
  378. // 图表的指标来源
  379. sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
  380. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  381. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  382. resp.ChartInfo = chartInfo
  383. resp.DataResp = resultResp
  384. resp.EdbInfoList = edbList
  385. // 将数据加入缓存
  386. if utils.Re == nil {
  387. data, _ := json.Marshal(resp)
  388. utils.Rc.Put(key, data, 2*time.Hour)
  389. }
  390. isOk = true
  391. return
  392. }
  393. // GetLineFeatureChartInfoDetailFromUniqueCode 根据编码获取统计特征图表详情
  394. func GetLineFeatureChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  395. resp = new(models.ChartInfoDetailResp)
  396. // 获取主题样式
  397. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
  398. if err != nil {
  399. msg = "获取失败"
  400. errMsg = "获取主题信息失败,Err:" + err.Error()
  401. return
  402. }
  403. chartInfo.ChartThemeStyle = chartTheme.Config
  404. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  405. // 获取图表关联指标
  406. edbMappingList, err := models.GetChartEdbMappingList(chartInfo.ChartInfoId)
  407. if err != nil {
  408. msg = "获取失败"
  409. errMsg = "获取图表关联指标信息失败,Err:" + err.Error()
  410. return
  411. }
  412. if len(edbMappingList) != 1 {
  413. msg = "获取失败"
  414. errMsg = fmt.Sprint("获取图表关联指标信息异常,数量:", len(edbMappingList))
  415. return
  416. }
  417. edbMapping := edbMappingList[0]
  418. var edbList []*models.ChartEdbInfoMapping
  419. var resultResp interface{}
  420. switch chartInfo.Source {
  421. case utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION:
  422. calculateValue, tmpErr := strconv.Atoi(chartInfo.ExtraConfig)
  423. if tmpErr != nil {
  424. msg = "获取失败"
  425. errMsg = "格式化配置项失败,Err:" + tmpErr.Error()
  426. return
  427. }
  428. startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
  429. edbList, resultResp, err, msg = lineFeatureServ.GetStandardDeviationData(chartInfo.ChartInfoId, startDate, endDate, edbMapping, calculateValue)
  430. case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
  431. var percentileConfig line_featureReq.Percentile
  432. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &percentileConfig)
  433. if err != nil {
  434. msg = "获取失败"
  435. errMsg = "格式化配置项失败,Err:" + err.Error()
  436. return
  437. }
  438. startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
  439. edbList, resultResp, err, msg = lineFeatureServ.GetPercentileData(chartInfo.ChartInfoId, startDate, endDate, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit, percentileConfig.PercentType)
  440. case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
  441. var frequencyDistributionConfig line_featureReq.FrequencyDistribution
  442. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &frequencyDistributionConfig)
  443. if err != nil {
  444. msg = "获取失败"
  445. errMsg = "格式化配置项失败,Err:" + err.Error()
  446. return
  447. }
  448. // 获取图表中的指标数据
  449. edbList, resultResp, err, errMsg = lineFeatureServ.GetFrequencyDistributionData(0, edbMapping, frequencyDistributionConfig.DateType, frequencyDistributionConfig.FrequencyValue, frequencyDistributionConfig.StartDate, frequencyDistributionConfig.EndDate)
  450. default:
  451. msg = `错误的图表`
  452. errMsg = fmt.Sprint("错误的图表来源,source", chartInfo.Source)
  453. return
  454. }
  455. if err != nil {
  456. if msg == `` {
  457. msg = "获取失败"
  458. }
  459. errMsg = "获取图表,指标信息失败,Err:" + err.Error()
  460. return
  461. }
  462. //chartInfo.UnitEn = baseEdbInfo.UnitEn
  463. // 图表的指标来源
  464. sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
  465. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  466. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  467. resp.ChartInfo = chartInfo
  468. resp.DataResp = resultResp
  469. resp.EdbInfoList = edbList
  470. // 将数据加入缓存
  471. if utils.Re == nil {
  472. data, _ := json.Marshal(resp)
  473. utils.Rc.Put(key, data, 2*time.Hour)
  474. }
  475. isOk = true
  476. return
  477. }
  478. // GetCrossVarietyChartInfoDetailFromUniqueCode 根据编码获取图表详情
  479. func GetCrossVarietyChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  480. resp = new(models.ChartInfoDetailResp)
  481. // 获取主题样式
  482. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 5)
  483. if err != nil {
  484. msg = "获取失败"
  485. errMsg = "获取主题信息失败,Err:" + err.Error()
  486. return
  487. }
  488. chartInfo.ChartThemeStyle = chartTheme.Config
  489. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  490. if chartInfo.ExtraConfig == `` {
  491. msg = "图表配置信息异常"
  492. errMsg = "图表配置信息异常"
  493. return
  494. }
  495. var config cross_varietyReq.ChartConfigReq
  496. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &config)
  497. if err != nil {
  498. msg = "解析跨品种分析配置失败"
  499. errMsg = "解析跨品种分析配置失败,Err:" + err.Error()
  500. return
  501. }
  502. // 获取图表x轴y轴
  503. edbList, dataResp, err, msg, _ := cross_variety.GetChartData(0, config)
  504. if err != nil {
  505. errMsg = "获取图表,指标信息失败,Err:" + err.Error()
  506. return
  507. }
  508. //判断是否需要展示英文标识
  509. //chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
  510. //chartInfo.UnitEn = edbInfoMappingA.UnitEn
  511. // 另存为
  512. resp.ChartInfo = chartInfo
  513. resp.DataResp = dataResp
  514. resp.EdbInfoList = edbList
  515. // 图表的指标来源
  516. sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
  517. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  518. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  519. // 将数据加入缓存
  520. if utils.Re == nil {
  521. d, _ := json.Marshal(resp)
  522. _ = utils.Rc.Put(key, d, 2*time.Hour)
  523. }
  524. isOk = true
  525. return
  526. }
  527. // FutureGoodChartInfoRefresh
  528. // @Title 商品价格图表刷新接口
  529. // @Description 商品价格图表刷新接口
  530. // @Param UniqueCode query string true "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
  531. // @Success Ret=200 刷新成功
  532. // @router /future_good/refresh [get]
  533. func (this *ChartController) FutureGoodChartInfoRefresh() {
  534. br := new(models.BaseResponse).Init()
  535. chartId := 0
  536. defer func() {
  537. // 添加日志
  538. if chartId > 0 {
  539. shareChartRefreshLogInfo := &models.ShareChartRefreshLog{
  540. Ip: this.Ctx.Input.IP(),
  541. ChartId: chartId,
  542. CreateTime: time.Now(),
  543. }
  544. models.AddShareChartRefreshLog(shareChartRefreshLogInfo)
  545. }
  546. this.Data["json"] = br
  547. this.ServeJSON()
  548. }()
  549. uniqueCode := this.GetString("UniqueCode")
  550. if uniqueCode == "" {
  551. br.Msg = "参数错误"
  552. br.ErrMsg = "参数错误,uniqueCode is empty"
  553. return
  554. }
  555. chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
  556. if err != nil {
  557. if err.Error() == utils.ErrNoRow() {
  558. br.Msg = "该图已被删除,请刷新页面"
  559. br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
  560. return
  561. }
  562. br.Msg = "获取失败"
  563. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  564. return
  565. }
  566. chartId = chartInfo.ChartInfoId
  567. err = future_goodServ.FutureGoodChartInfoRefresh(chartInfo.ChartInfoId)
  568. if err != nil {
  569. br.Msg = "刷新失败"
  570. br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
  571. return
  572. }
  573. //err = data.ChartInfoRefresh(chartInfo.ChartInfoId)
  574. //if err != nil {
  575. // br.Msg = "刷新失败"
  576. // br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
  577. // return
  578. //}
  579. //err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
  580. //if err != nil {
  581. // br.Msg = "刷新失败"
  582. // br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
  583. // return
  584. //}
  585. //清除数据缓存
  586. key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
  587. if utils.Re == nil {
  588. utils.Rc.Delete(key)
  589. }
  590. br.Ret = 200
  591. br.Success = true
  592. br.Msg = "刷新成功"
  593. }
  594. // GetCorrelationChartInfoDetailFromUniqueCode 根据编码获取相关性图表详情
  595. func GetCorrelationChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
  596. resp = new(models.ChartInfoDetailResp)
  597. // 获取主题样式
  598. chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
  599. if err != nil {
  600. msg = "获取失败"
  601. errMsg = "获取主题信息失败,Err:" + err.Error()
  602. return
  603. }
  604. chartInfo.ChartThemeStyle = chartTheme.Config
  605. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  606. chartInfoId := chartInfo.ChartInfoId
  607. startDate := chartInfo.StartDate
  608. endDate := chartInfo.EndDate
  609. // 兼容日期错误
  610. {
  611. if strings.Count(startDate, "-") == 1 {
  612. startDate = startDate + "-01"
  613. }
  614. if strings.Count(endDate, "-") == 1 {
  615. endDate = endDate + "-01"
  616. }
  617. }
  618. // 相关性图表信息
  619. correlationChart := new(data_manage.ChartInfoCorrelation)
  620. if e := correlationChart.GetItemById(chartInfoId); e != nil {
  621. msg = "获取失败"
  622. errMsg = "获取图表相关性信息失败, Err:" + e.Error()
  623. return
  624. }
  625. // 获取指标信息
  626. edbInfoMappingA, e := models.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
  627. if e != nil {
  628. msg = "获取失败"
  629. errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + e.Error()
  630. return
  631. }
  632. edbInfoMappingB, e := models.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
  633. if e != nil {
  634. msg = "获取失败"
  635. errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + e.Error()
  636. return
  637. }
  638. var dataResp interface{} // 绘图数据返回(目前是滚动相关性的图)
  639. var xEdbIdValue []int
  640. var yDataList []models.YData
  641. switch chartInfo.Source {
  642. case utils.CHART_SOURCE_CORRELATION: // 相关性图
  643. moveUnitDays, ok := utils.FrequencyDaysMap[correlationChart.CalculateUnit]
  644. if !ok {
  645. msg = "错误的分析周期"
  646. errMsg = "相关性图表数据有误"
  647. return
  648. }
  649. startDate := time.Now().AddDate(0, 0, -correlationChart.CalculateValue*moveUnitDays).Format(utils.FormatDate)
  650. endDate := time.Now().Format(utils.FormatDate)
  651. xEdbIdValue, yDataList, e = correlationServ.GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, startDate, endDate)
  652. if e != nil {
  653. msg = "获取失败"
  654. errMsg = "获取相关性图表, 图表计算值失败, Err:" + e.Error()
  655. return
  656. }
  657. case utils.CHART_SOURCE_ROLLING_CORRELATION: // 滚动相关性图
  658. startDate, endDate := utils.GetDateByDateType(correlationChart.DateType, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
  659. dataResp, e = correlationServ.GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.CalculateValue, correlationChart.CalculateUnit, startDate, endDate, chartInfo.ChartName, chartInfo.ChartNameEn)
  660. }
  661. // 完善指标信息
  662. edbList, e := correlationServ.GetChartEdbInfoFormat(chartInfo.ChartInfoId, edbInfoMappingA, edbInfoMappingB)
  663. if e != nil {
  664. msg = "获取失败"
  665. errMsg = "获取相关性图表, 完善指标信息失败, Err:" + e.Error()
  666. return
  667. }
  668. // 图表的指标来源
  669. sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
  670. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  671. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  672. correlationInfo := new(models.CorrelationInfo)
  673. correlationInfo.LeadValue = correlationChart.LeadValue
  674. correlationInfo.LeadUnit = correlationChart.LeadUnit
  675. correlationInfo.StartDate = correlationChart.StartDate.Format(utils.FormatDate)
  676. correlationInfo.EndDate = correlationChart.EndDate.Format(utils.FormatDate)
  677. correlationInfo.LeadValue = correlationChart.LeadValue
  678. correlationInfo.EdbInfoIdFirst = correlationChart.EdbInfoIdFirst
  679. correlationInfo.EdbInfoIdSecond = correlationChart.EdbInfoIdSecond
  680. resp.ChartInfo = chartInfo
  681. resp.EdbInfoList = edbList
  682. resp.XEdbIdValue = xEdbIdValue
  683. resp.YDataList = yDataList
  684. resp.CorrelationChartInfo = correlationInfo
  685. resp.DataResp = dataResp
  686. // 将数据加入缓存
  687. if utils.Re == nil {
  688. d, _ := json.Marshal(resp)
  689. _ = utils.Rc.Put(key, d, 2*time.Hour)
  690. }
  691. isOk = true
  692. return
  693. }
  694. // CorrelationChartInfoRefresh
  695. // @Title 商品价格图表刷新接口
  696. // @Description 商品价格图表刷新接口
  697. // @Param UniqueCode query string true "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
  698. // @Success Ret=200 刷新成功
  699. // @router /correlation/refresh [get]
  700. func (this *ChartController) CorrelationChartInfoRefresh() {
  701. br := new(models.BaseResponse).Init()
  702. chartId := 0
  703. defer func() {
  704. // 添加日志
  705. if chartId > 0 {
  706. shareChartRefreshLogInfo := &models.ShareChartRefreshLog{
  707. Ip: this.Ctx.Input.IP(),
  708. ChartId: chartId,
  709. CreateTime: time.Now(),
  710. }
  711. models.AddShareChartRefreshLog(shareChartRefreshLogInfo)
  712. }
  713. this.Data["json"] = br
  714. this.ServeJSON()
  715. }()
  716. uniqueCode := this.GetString("UniqueCode")
  717. if uniqueCode == "" {
  718. br.Msg = "参数错误"
  719. br.ErrMsg = "参数错误,uniqueCode is empty"
  720. return
  721. }
  722. chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
  723. if err != nil {
  724. if err.Error() == utils.ErrNoRow() {
  725. br.Msg = "该图已被删除,请刷新页面"
  726. br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
  727. return
  728. }
  729. br.Msg = "获取失败"
  730. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  731. return
  732. }
  733. chartId = chartInfo.ChartInfoId
  734. err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
  735. if err != nil {
  736. br.Msg = "刷新失败"
  737. br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
  738. return
  739. }
  740. //// 刷新相关性图表
  741. //if e := correlationServ.ChartInfoRefresh(chartInfo.ChartInfoId); e != nil {
  742. // br.Msg = "刷新失败"
  743. // br.ErrMsg = "刷新相关性图表失败, Err:" + e.Error()
  744. // return
  745. //}
  746. //清除数据缓存
  747. key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
  748. if utils.Re == nil {
  749. _ = utils.Rc.Delete(key)
  750. }
  751. br.Ret = 200
  752. br.Success = true
  753. br.Msg = "刷新成功"
  754. }