chart_common.go 27 KB

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