chart_common.go 33 KB

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