chart_info.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. package future_good
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "hongze/hongze_yb/models/request"
  7. "hongze/hongze_yb/models/response/chart_info"
  8. chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
  9. edbDataModel "hongze/hongze_yb/models/tables/edb_data"
  10. "hongze/hongze_yb/models/tables/future_good_edb_data"
  11. "hongze/hongze_yb/models/tables/future_good_edb_info"
  12. "hongze/hongze_yb/services/alarm_msg"
  13. "hongze/hongze_yb/services/chart"
  14. "hongze/hongze_yb/utils"
  15. "strconv"
  16. "time"
  17. )
  18. // GetChartEdbData 获取图表的指标数据
  19. func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping, futureGoodEdbInfoMapping *chartEdbMappingModel.ChartEdbInfoMappingList, barChartInfoDateList []request.BarChartInfoDateReq) (barConfigEdbInfoIdList []request.BarChartInfoEdbItemReq, edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, xEdbIdValue []int, xDataList []chart_info.XData, yDataList []chart_info.YData, sourceArr []string, err error) {
  20. edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
  21. sourceArr = make([]string, 0)
  22. if futureGoodEdbInfoMapping == nil {
  23. err = errors.New("商品指标未选取")
  24. return
  25. }
  26. if edbInfoMapping == nil {
  27. err = errors.New("ETA指标未选取")
  28. return
  29. }
  30. // 指标对应的所有数据
  31. edbDataListMap := make(map[int][]*edbDataModel.EdbDataList)
  32. item := new(chartEdbMappingModel.ChartEdbInfoMappingList)
  33. edbInfoMapping.FrequencyEn = chart.GetFrequencyEn(edbInfoMapping.Frequency)
  34. if edbInfoMapping.Unit == `无` {
  35. edbInfoMapping.Unit = ``
  36. }
  37. if futureGoodEdbInfoMapping.Unit == `无` {
  38. futureGoodEdbInfoMapping.Unit = ``
  39. }
  40. if chartInfoId <= 0 {
  41. edbInfoMapping.IsAxis = 1
  42. edbInfoMapping.LeadValue = 0
  43. edbInfoMapping.LeadUnit = ""
  44. edbInfoMapping.ChartEdbMappingId = 0
  45. edbInfoMapping.ChartInfoId = 0
  46. edbInfoMapping.IsOrder = false
  47. edbInfoMapping.EdbInfoType = 1
  48. edbInfoMapping.ChartStyle = ""
  49. edbInfoMapping.ChartColor = ""
  50. edbInfoMapping.ChartWidth = 0
  51. futureGoodEdbInfoMapping.IsAxis = 1
  52. futureGoodEdbInfoMapping.LeadValue = 0
  53. futureGoodEdbInfoMapping.LeadUnit = ""
  54. futureGoodEdbInfoMapping.ChartEdbMappingId = 0
  55. futureGoodEdbInfoMapping.ChartInfoId = 0
  56. futureGoodEdbInfoMapping.IsOrder = false
  57. futureGoodEdbInfoMapping.EdbInfoType = 1
  58. futureGoodEdbInfoMapping.ChartStyle = ""
  59. futureGoodEdbInfoMapping.ChartColor = ""
  60. futureGoodEdbInfoMapping.ChartWidth = 0
  61. } else {
  62. edbInfoMapping.LeadUnitEn = chart.GetLeadUnitEn(edbInfoMapping.LeadUnit)
  63. futureGoodEdbInfoMapping.LeadUnitEn = chart.GetLeadUnitEn(futureGoodEdbInfoMapping.LeadUnit)
  64. }
  65. // 普通的指标数据
  66. {
  67. dataList := make([]*edbDataModel.EdbDataList, 0)
  68. dataList, err = edbDataModel.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.EdbInfoId, startDate, endDate)
  69. edbDataListMap[edbInfoMapping.EdbInfoId] = dataList
  70. item.DataList = dataList
  71. edbList = append(edbList, edbInfoMapping)
  72. barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, request.BarChartInfoEdbItemReq{
  73. EdbInfoId: edbInfoMapping.EdbInfoId,
  74. //Name: edbInfoMapping.EdbName,
  75. Name: "现货价",
  76. NameEn: "Spot Price",
  77. Source: edbInfoMapping.Source,
  78. })
  79. if !utils.InArray(edbInfoMapping.Source, utils.SystemSourceList) { //来源于系统的指标,都展示为弘则研究
  80. if !utils.InArray(edbInfoMapping.SourceName, sourceArr) {
  81. sourceArr = append(sourceArr, edbInfoMapping.SourceName)
  82. }
  83. }
  84. }
  85. // 获取主力合约和最新日期
  86. var zlFutureGoodEdbInfo *future_good_edb_info.FutureGoodEdbInfo
  87. var latestDate string // 最新日期是这个
  88. var regionType string // 交易所来源:“国内”,“海外”
  89. {
  90. // 寻找主力合约
  91. zlFutureGoodEdbInfo, err = future_good_edb_info.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
  92. if err != nil {
  93. return
  94. }
  95. regionType = zlFutureGoodEdbInfo.RegionType
  96. // 如果当前合约配置的 "画图时,日期来源的指标id" 并不是自己的话,那么就去查找对应配置的合约
  97. if uint64(zlFutureGoodEdbInfo.DateSourceID) != zlFutureGoodEdbInfo.FutureGoodEdbInfoID {
  98. sourceDateFutureGoodEdbInfo, tmpErr := future_good_edb_info.GetFutureGoodEdbInfo(int(zlFutureGoodEdbInfo.DateSourceID))
  99. if tmpErr != nil {
  100. err = tmpErr
  101. return
  102. }
  103. latestDate = sourceDateFutureGoodEdbInfo.EndDate.Format(utils.FormatDate) // 最新日期是这个
  104. } else {
  105. latestDate = zlFutureGoodEdbInfo.EndDate.Format(utils.FormatDate) // 最新日期是这个
  106. }
  107. if latestDate == `0000-00-00` {
  108. err = errors.New("日期异常")
  109. return
  110. }
  111. }
  112. // 获取期货指标以及期货数据
  113. tmpFutureGoodEdbInfoList, err := future_good_edb_info.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
  114. if err != nil {
  115. return
  116. }
  117. maxM := 36
  118. futureGoodEdbInfoList := make([]*future_good_edb_info.FutureGoodEdbInfo, 0)
  119. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
  120. for _, v := range tmpFutureGoodEdbInfoList {
  121. if v.RegionType == `国内` {
  122. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  123. continue
  124. }
  125. //海外的连续日期,目前
  126. if v.FutureGoodEdbType == 2 {
  127. if int(v.Month) <= maxM {
  128. addMonth := int(latestDateTime.Month()) + int(v.Month)
  129. v.Year = latestDateTime.Year() + addMonth/12
  130. realMonth := addMonth % 12
  131. if realMonth == 0 {
  132. realMonth = 12
  133. }
  134. v.Month = uint32(realMonth)
  135. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  136. }
  137. continue
  138. }
  139. // 小于等于当前年,那么就肯定是ok的
  140. if v.Year <= latestDateTime.Year() {
  141. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  142. continue
  143. }
  144. // 如果(当前年-最新日期的年份) * 12个月 + (当前月-最新日期的月份) 小于总月份
  145. if (v.Year-latestDateTime.Year())*12+(int(v.Month)-int(latestDateTime.Month())) <= maxM {
  146. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  147. continue
  148. }
  149. }
  150. futureGoodMappingList := make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
  151. for k, v := range futureGoodEdbInfoList {
  152. newMappingInfo := &chartEdbMappingModel.ChartEdbInfoMappingList{
  153. ChartEdbInfoMapping: chartEdbMappingModel.ChartEdbInfoMapping{
  154. EdbInfoId: int(v.FutureGoodEdbInfoID),
  155. SourceName: v.Exchange,
  156. Source: utils.CHART_SOURCE_FUTURE_GOOD,
  157. EdbCode: v.FutureGoodEdbCode,
  158. EdbName: v.FutureGoodEdbName,
  159. EdbAliasName: v.FutureGoodEdbName,
  160. EdbNameEn: v.FutureGoodEdbNameEn,
  161. EdbType: edbInfoMapping.EdbType,
  162. Frequency: edbInfoMapping.Frequency,
  163. FrequencyEn: edbInfoMapping.FrequencyEn,
  164. Unit: edbInfoMapping.Unit,
  165. UnitEn: edbInfoMapping.UnitEn,
  166. StartDate: v.StartDate.Format(utils.FormatDateTime),
  167. EndDate: v.EndDate.Format(utils.FormatDateTime),
  168. ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
  169. ChartEdbMappingId: int(v.FutureGoodEdbInfoID),
  170. ChartInfoId: edbInfoMapping.ChartInfoId,
  171. MaxData: v.MaxValue,
  172. MinData: v.MinValue,
  173. IsOrder: edbInfoMapping.IsOrder,
  174. IsAxis: edbInfoMapping.IsAxis,
  175. EdbInfoType: edbInfoMapping.EdbInfoType,
  176. EdbInfoCategoryType: edbInfoMapping.EdbInfoCategoryType,
  177. LeadValue: edbInfoMapping.LeadValue,
  178. LeadUnit: edbInfoMapping.LeadUnit,
  179. LeadUnitEn: edbInfoMapping.LeadUnitEn,
  180. ChartStyle: edbInfoMapping.ChartStyle,
  181. ChartColor: edbInfoMapping.ChartColor,
  182. PredictChartColor: edbInfoMapping.PredictChartColor,
  183. ChartWidth: edbInfoMapping.ChartWidth,
  184. ChartType: edbInfoMapping.ChartType,
  185. LatestDate: v.LatestDate,
  186. LatestValue: v.LatestValue,
  187. UniqueCode: futureGoodEdbInfoMapping.UniqueCode + "1" + strconv.Itoa(k),
  188. MinValue: v.MinValue,
  189. MaxValue: v.MaxValue,
  190. },
  191. DataList: nil,
  192. IsNullData: false,
  193. }
  194. futureGoodMappingList = append(futureGoodMappingList, newMappingInfo)
  195. barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, request.BarChartInfoEdbItemReq{
  196. EdbInfoId: newMappingInfo.EdbInfoId,
  197. Name: fmt.Sprint("M+", v.Month),
  198. NameEn: fmt.Sprint("M+", v.Month),
  199. Source: newMappingInfo.Source,
  200. })
  201. }
  202. // 获取数据
  203. for _, v := range futureGoodMappingList {
  204. dataList := make([]*edbDataModel.EdbDataList, 0)
  205. tmpDataList, tmpErr := future_good_edb_data.GetFutureGoodEdbDataListByDate(v.EdbInfoId, startDate, endDate)
  206. if tmpErr != nil {
  207. return
  208. }
  209. for _, tmpData := range tmpDataList {
  210. dataList = append(dataList, &edbDataModel.EdbDataList{
  211. EdbDataId: int(tmpData.FutureGoodEdbDataID),
  212. EdbInfoId: int(tmpData.FutureGoodEdbInfoID),
  213. DataTime: tmpData.DataTime.Format(utils.FormatDate),
  214. DataTimestamp: tmpData.DataTimestamp,
  215. Value: tmpData.Close,
  216. })
  217. }
  218. edbDataListMap[v.EdbInfoId] = dataList
  219. v.DataList = dataList
  220. }
  221. edbList = append(edbList, futureGoodMappingList...)
  222. xEdbIdValue, yDataList, err = BarChartData(edbList[0], futureGoodEdbInfoList, edbDataListMap, barChartInfoDateList, regionType, latestDate)
  223. xDataList = []chart_info.XData{
  224. {
  225. Name: "现货价",
  226. NameEn: "Spot Price",
  227. },
  228. }
  229. if regionType == `国内` {
  230. for i := range futureGoodEdbInfoList {
  231. xDataList = append(xDataList, chart_info.XData{
  232. Name: fmt.Sprint("M+", i),
  233. NameEn: fmt.Sprint("M+ ", i),
  234. })
  235. }
  236. } else {
  237. for _, v := range futureGoodEdbInfoList {
  238. divMonth := (v.Year-latestDateTime.Year())*12 + (int(v.Month) - int(latestDateTime.Month()))
  239. xDataList = append(xDataList, chart_info.XData{
  240. Name: fmt.Sprint("M+", divMonth),
  241. NameEn: fmt.Sprint("M+ ", divMonth),
  242. })
  243. }
  244. }
  245. return
  246. }
  247. // BarChartData 商品价格曲线的数据处理
  248. func BarChartData(edbInfoMapping *chartEdbMappingModel.ChartEdbInfoMappingList, futureGoodMappingList []*future_good_edb_info.FutureGoodEdbInfo, edbDataListMap map[int][]*edbDataModel.EdbDataList, barChartInfoDateList []request.BarChartInfoDateReq, regionType, latestDate string) (edbIdList []int, yDataList []chart_info.YData, err error) {
  249. // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
  250. edbDataMap := make(map[int]map[string]float64)
  251. for edbInfoId, edbDataList := range edbDataListMap {
  252. edbDateData := make(map[string]float64)
  253. for _, edbData := range edbDataList {
  254. edbDateData[edbData.DataTime] = edbData.Value
  255. }
  256. edbDataMap[edbInfoId] = edbDateData
  257. }
  258. // edbIdList 指标展示顺序;x轴的指标顺序
  259. edbIdList = make([]int, 0)
  260. edbIdList = append(edbIdList, edbInfoMapping.EdbInfoId)
  261. for _, v := range futureGoodMappingList {
  262. edbIdList = append(edbIdList, int(v.FutureGoodEdbInfoID))
  263. }
  264. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
  265. yDataList = make([]chart_info.YData, 0) //y轴的数据列表
  266. for _, barChartInfoDate := range barChartInfoDateList {
  267. var maxDate time.Time
  268. var findDateTime time.Time
  269. switch barChartInfoDate.Type {
  270. case 1: //最新值
  271. findDateTime = latestDateTime
  272. case 2: //近期几天
  273. findDateTime = latestDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  274. case 3: // 固定日期
  275. //寻找固定日期的数据
  276. tmpFindDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  277. if tmpErr != nil {
  278. err = tmpErr
  279. return
  280. }
  281. findDateTime = tmpFindDateTime
  282. default:
  283. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  284. return
  285. }
  286. if findDateTime.IsZero() {
  287. err = errors.New("错误的日期")
  288. return
  289. }
  290. findDataList := make([]float64, 0) // 当前日期的数据值
  291. noDataIdList := make([]int, 0) // 没有数据的指标id
  292. noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
  293. xEdbInfoIdList := make([]int, 0) // 当前数据的指标id列表
  294. // 现货指标
  295. realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[edbInfoMapping.EdbInfoId], edbDataMap[edbInfoMapping.EdbInfoId])
  296. if tmpErr != nil {
  297. err = tmpErr
  298. return
  299. }
  300. findDataList = append(findDataList, findDataValue)
  301. if isFind {
  302. maxDate = realDateTime
  303. } else {
  304. noDataIdList = append(noDataIdList, edbInfoMapping.EdbInfoId)
  305. noDataIdMap[edbInfoMapping.EdbInfoId] = edbInfoMapping.EdbInfoId
  306. }
  307. currMonth := findDateTime.Month() // 当前月份
  308. currYear := findDateTime.Year() // 当前年份
  309. xEdbInfoIdList = append(xEdbInfoIdList, edbInfoMapping.EdbInfoId)
  310. indexList := make([]int, 0)
  311. if regionType == `国内` {
  312. for i := currMonth; i < 12; i++ {
  313. indexList = append(indexList, int(i))
  314. }
  315. for i := 1; i < int(currMonth); i++ {
  316. indexList = append(indexList, i)
  317. }
  318. } else {
  319. for i, v := range futureGoodMappingList {
  320. if v.Year > currYear || (v.Year == currYear && int(v.Month) >= int(currMonth)) {
  321. indexList = append(indexList, i)
  322. }
  323. }
  324. }
  325. for _, i := range indexList {
  326. futureGoodMapping := futureGoodMappingList[i] // 当前的期货指标
  327. tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[int(futureGoodMapping.FutureGoodEdbInfoID)], edbDataMap[int(futureGoodMapping.FutureGoodEdbInfoID)])
  328. if tmpErr != nil {
  329. err = tmpErr
  330. return
  331. }
  332. findDataList = append(findDataList, tmpFindDataValue)
  333. if tmpIsFind {
  334. if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
  335. maxDate = tmpRealDateTime
  336. }
  337. } else {
  338. noDataIdList = append(noDataIdList, int(futureGoodMapping.FutureGoodEdbInfoID))
  339. noDataIdMap[int(futureGoodMapping.FutureGoodEdbInfoID)] = int(futureGoodMapping.FutureGoodEdbInfoID)
  340. }
  341. // 当前期货合约的指标
  342. xEdbInfoIdList = append(xEdbInfoIdList, int(futureGoodMapping.FutureGoodEdbInfoID))
  343. }
  344. yName := barChartInfoDate.Name
  345. yNameEn := barChartInfoDate.Name
  346. if yName == `` {
  347. if barChartInfoDate.Type == 2 {
  348. yName = strconv.Itoa(barChartInfoDate.Value) + "天前"
  349. if barChartInfoDate.Value == 1 {
  350. yNameEn = strconv.Itoa(barChartInfoDate.Value) + "day ago"
  351. } else {
  352. yNameEn = strconv.Itoa(barChartInfoDate.Value) + " days ago"
  353. }
  354. } else {
  355. yName = maxDate.Format(utils.FormatDate)
  356. yNameEn = maxDate.Format(utils.FormatDate)
  357. }
  358. }
  359. yDate := "0000-00-00"
  360. if !maxDate.IsZero() {
  361. yDate = maxDate.Format(utils.FormatDate)
  362. }
  363. // 数据处理,将没有数据的下标,赋值平均值
  364. {
  365. hasDataIndexList := make([]int, 0)
  366. for dataK, edbInfoId := range xEdbInfoIdList {
  367. if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
  368. hasDataIndexList = append(hasDataIndexList, dataK)
  369. }
  370. }
  371. lenHasDataIndex := len(hasDataIndexList)
  372. if lenHasDataIndex > 0 {
  373. for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
  374. perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
  375. currK := hasDataIndexList[lenHasDataI] //当前有数据的指标下标
  376. preVal := findDataList[perK] //上一个有数据的坐标的值
  377. currVal := findDataList[currK] //当前有数据的指标的值
  378. // 环差值
  379. hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
  380. var tmpI int64
  381. // 将两个中间的数据做平均值补全
  382. for hcI := perK + 1; hcI < currK; hcI++ {
  383. tmpI++
  384. findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
  385. }
  386. }
  387. }
  388. }
  389. yDataList = append(yDataList, chart_info.YData{
  390. Date: yDate,
  391. Value: findDataList,
  392. NoDataEdbList: noDataIdList,
  393. XEdbInfoIdList: xEdbInfoIdList,
  394. Color: barChartInfoDate.Color,
  395. Name: yName,
  396. NameEn: yNameEn,
  397. })
  398. }
  399. return
  400. }
  401. // GetNeedDateData 获取合约内需要的日期数据
  402. func GetNeedDateData(needDateTime time.Time, dataList []*edbDataModel.EdbDataList, edbDataMap map[string]float64) (findDateTime time.Time, findDataValue float64, isFind bool, err error) {
  403. //dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  404. if len(dataList) <= 0 {
  405. // 没有数据的指标id
  406. return
  407. }
  408. //最早的日期
  409. minDateTime, err := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  410. if err != nil {
  411. return
  412. }
  413. for tmpDateTime := needDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  414. tmpDate := tmpDateTime.Format(utils.FormatDate)
  415. if tmpValue, ok := edbDataMap[tmpDate]; ok { //如果能找到数据,那么就返回
  416. // 数据为0,也直接返回,做无值处理
  417. if tmpValue == 0 {
  418. return
  419. }
  420. findDateTime, _ = time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
  421. findDataValue = tmpValue
  422. isFind = true
  423. return
  424. }
  425. }
  426. return
  427. }
  428. // FutureGoodChartInfoRefresh
  429. // @author Roc
  430. // @datetime 2023-2-2 18:44:46
  431. // @description 商品价格曲线图表刷新
  432. func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
  433. var errMsg string
  434. defer func() {
  435. if err != nil {
  436. go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
  437. fmt.Println("ChartInfoRefresh Err:" + errMsg)
  438. }
  439. }()
  440. edbInfoMapping, err := chartEdbMappingModel.GetEtaEdbChartEdbMapping(chartInfoId)
  441. if err != nil {
  442. errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
  443. return
  444. }
  445. // 获取期货指标
  446. futureGoodEdbInfoMapping, err := chartEdbMappingModel.GetFutureGoodEdbChartEdbMapping(chartInfoId)
  447. if err != nil {
  448. errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
  449. return
  450. }
  451. // 获取期货指标以及期货数据
  452. futureGoodEdbInfoList, err := future_good_edb_info.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
  453. if err != nil {
  454. return
  455. }
  456. // 批量刷新ETA指标
  457. err, _ = chart.EdbInfoRefreshAllFromBase([]int{edbInfoMapping.EdbInfoId}, false)
  458. if err != nil {
  459. return
  460. }
  461. // 批量刷新期货指标
  462. err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
  463. if err != nil {
  464. return
  465. }
  466. return
  467. }