chart_common.go 29 KB

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