chart_common.go 29 KB

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