chart_common.go 28 KB

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