chart_common.go 30 KB

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