chart_common.go 29 KB

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