chart_info.go 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. package future_good
  2. import (
  3. "errors"
  4. "eta/eta_chart_lib/models"
  5. "eta/eta_chart_lib/models/data_manage"
  6. future_good2 "eta/eta_chart_lib/models/data_manage/future_good"
  7. "eta/eta_chart_lib/services/alarm_msg"
  8. "eta/eta_chart_lib/services/data"
  9. "eta/eta_chart_lib/utils"
  10. "fmt"
  11. "github.com/shopspring/decimal"
  12. "sort"
  13. "strconv"
  14. "time"
  15. )
  16. // GetChartEdbData 获取图表的指标数据
  17. func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapping *models.ChartEdbInfoMapping, edbInfoMappingList []*models.ChartEdbInfoMapping, futureGoodEdbInfoMapping *models.ChartEdbInfoMapping, barChartInfoConf data_manage.FutureGoodBarChartInfoReq, needData bool) (barConfigEdbInfoIdList []data_manage.BarChartInfoEdbItemReq, edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, xDataList []data_manage.XData, yDataList []models.YData, err error) {
  18. edbList = make([]*models.ChartEdbInfoMapping, 0)
  19. barChartInfoDateList := barChartInfoConf.DateList
  20. baseEdbInfoId := barChartInfoConf.BaseEdbInfoId
  21. if futureGoodEdbInfoMapping == nil {
  22. err = errors.New("商品指标未选取")
  23. return
  24. }
  25. if len(edbInfoMappingList) == 0 {
  26. err = errors.New("ETA指标未选取")
  27. return
  28. }
  29. // 指标对应的所有数据
  30. edbDataListMap := make(map[int][]*models.EdbDataList)
  31. // todo item
  32. //item := new(models.ChartEdbInfoMapping)
  33. if futureGoodEdbInfoMapping.Unit == `无` {
  34. futureGoodEdbInfoMapping.Unit = ``
  35. }
  36. if chartInfoId <= 0 {
  37. for k, edbInfoMapping := range edbInfoMappingList {
  38. edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
  39. if edbInfoMapping.Unit == `无` {
  40. edbInfoMapping.Unit = ``
  41. }
  42. edbInfoMapping.IsAxis = 1
  43. edbInfoMapping.LeadValue = 0
  44. edbInfoMapping.LeadUnit = ""
  45. edbInfoMapping.ChartEdbMappingId = 0
  46. edbInfoMapping.ChartInfoId = 0
  47. edbInfoMapping.IsOrder = false
  48. edbInfoMapping.EdbInfoType = 1
  49. edbInfoMapping.ChartStyle = ""
  50. edbInfoMapping.ChartColor = ""
  51. edbInfoMapping.ChartWidth = 0
  52. edbInfoMappingList[k] = edbInfoMapping
  53. }
  54. futureGoodEdbInfoMapping.IsAxis = 1
  55. futureGoodEdbInfoMapping.LeadValue = 0
  56. futureGoodEdbInfoMapping.LeadUnit = ""
  57. futureGoodEdbInfoMapping.ChartEdbMappingId = 0
  58. futureGoodEdbInfoMapping.ChartInfoId = 0
  59. futureGoodEdbInfoMapping.IsOrder = false
  60. futureGoodEdbInfoMapping.EdbInfoType = 1
  61. futureGoodEdbInfoMapping.ChartStyle = ""
  62. futureGoodEdbInfoMapping.ChartColor = ""
  63. futureGoodEdbInfoMapping.ChartWidth = 0
  64. } else {
  65. for k, edbInfoMapping := range edbInfoMappingList {
  66. edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
  67. if edbInfoMapping.Unit == `无` {
  68. edbInfoMapping.Unit = ``
  69. }
  70. edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
  71. edbInfoMappingList[k] = edbInfoMapping
  72. }
  73. futureGoodEdbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(futureGoodEdbInfoMapping.LeadUnit)
  74. }
  75. //查询横轴配置项
  76. xDataItemMap := make(map[int]data_manage.XData)
  77. for k, v := range barChartInfoConf.XDataList {
  78. xDataItemMap[k] = v
  79. }
  80. // 普通的指标数据
  81. {
  82. edbList = edbInfoMappingList
  83. for k, edbInfoMapping := range edbInfoMappingList {
  84. tmp := data_manage.BarChartInfoEdbItemReq{
  85. EdbInfoId: edbInfoMapping.EdbInfoId,
  86. Name: edbInfoMapping.EdbName,
  87. NameEn: edbInfoMapping.EdbNameEn,
  88. Source: edbInfoMapping.Source,
  89. }
  90. // 如果有配置,则用配置中的指标名称替换
  91. xItem, ok := xDataItemMap[k]
  92. if ok && xItem.Name != "" {
  93. tmp.Name = xItem.Name
  94. tmp.NameEn = xItem.NameEn
  95. tmp.IsHide = xItem.IsHide
  96. }
  97. barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, tmp)
  98. }
  99. }
  100. // 获取主力合约和最新日期
  101. var zlFutureGoodEdbInfo *future_good2.FutureGoodEdbInfo
  102. var latestDate string // 最新日期是这个
  103. var regionType string // 交易所来源:“国内”,“海外”
  104. var futureGoodEdbType int
  105. {
  106. // 寻找主力合约
  107. zlFutureGoodEdbInfo, err = future_good2.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
  108. if err != nil {
  109. return
  110. }
  111. regionType = zlFutureGoodEdbInfo.RegionType
  112. futureGoodEdbType = zlFutureGoodEdbInfo.FutureGoodEdbType
  113. // 如果当前合约配置的 "画图时,日期来源的指标id" 并不是自己的话,那么就去查找对应配置的合约
  114. if zlFutureGoodEdbInfo.DateSourceId != zlFutureGoodEdbInfo.FutureGoodEdbInfoId {
  115. sourceDateFutureGoodEdbInfo, tmpErr := future_good2.GetFutureGoodEdbInfo(zlFutureGoodEdbInfo.DateSourceId)
  116. if tmpErr != nil {
  117. err = tmpErr
  118. return
  119. }
  120. latestDate = sourceDateFutureGoodEdbInfo.EndDate // 最新日期是这个
  121. } else {
  122. latestDate = zlFutureGoodEdbInfo.EndDate // 最新日期是这个
  123. }
  124. if latestDate == `0000-00-00` {
  125. err = errors.New("日期异常")
  126. return
  127. }
  128. }
  129. // 获取期货指标以及期货数据
  130. tmpFutureGoodEdbInfoList, err := future_good2.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
  131. if err != nil {
  132. return
  133. }
  134. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
  135. _, futureGoodEdbInfoList, err := getFutureGoodEdbInfoList(latestDateTime, tmpFutureGoodEdbInfoList, barChartInfoDateList)
  136. if err != nil {
  137. return
  138. }
  139. futureGoodMappingList := make([]*models.ChartEdbInfoMapping, 0)
  140. for k, v := range futureGoodEdbInfoList {
  141. newMappingInfo := &models.ChartEdbInfoMapping{
  142. EdbInfoId: v.FutureGoodEdbInfoId,
  143. SourceName: v.Exchange,
  144. Source: 0,
  145. EdbCode: v.FutureGoodEdbCode,
  146. EdbName: v.FutureGoodEdbName,
  147. EdbAliasName: v.FutureGoodEdbName,
  148. EdbNameEn: v.FutureGoodEdbNameEn,
  149. EdbType: baseEdbInfoMapping.EdbType, //todo baseEdbInfoMapping
  150. Frequency: baseEdbInfoMapping.Frequency,
  151. FrequencyEn: baseEdbInfoMapping.FrequencyEn,
  152. Unit: baseEdbInfoMapping.Unit,
  153. UnitEn: baseEdbInfoMapping.UnitEn,
  154. StartDate: v.StartDate,
  155. EndDate: v.EndDate,
  156. ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
  157. ChartEdbMappingId: v.FutureGoodEdbInfoId,
  158. ChartInfoId: baseEdbInfoMapping.ChartInfoId,
  159. MaxData: v.MaxValue,
  160. MinData: v.MinValue,
  161. IsOrder: baseEdbInfoMapping.IsOrder,
  162. IsAxis: baseEdbInfoMapping.IsAxis,
  163. EdbInfoType: baseEdbInfoMapping.EdbInfoType,
  164. EdbInfoCategoryType: baseEdbInfoMapping.EdbInfoCategoryType,
  165. LeadValue: baseEdbInfoMapping.LeadValue,
  166. LeadUnit: baseEdbInfoMapping.LeadUnit,
  167. LeadUnitEn: baseEdbInfoMapping.LeadUnitEn,
  168. ChartStyle: baseEdbInfoMapping.ChartStyle,
  169. ChartColor: baseEdbInfoMapping.ChartColor,
  170. PredictChartColor: baseEdbInfoMapping.PredictChartColor,
  171. ChartWidth: baseEdbInfoMapping.ChartWidth,
  172. ChartType: baseEdbInfoMapping.ChartType,
  173. LatestDate: v.LatestDate.Format(utils.FormatDateTime),
  174. LatestValue: v.LatestValue,
  175. UniqueCode: futureGoodEdbInfoMapping.UniqueCode + strconv.Itoa(k),
  176. MinValue: v.MinValue,
  177. MaxValue: v.MaxValue,
  178. DataList: nil,
  179. IsNullData: false,
  180. }
  181. futureGoodMappingList = append(futureGoodMappingList, newMappingInfo)
  182. tmp := data_manage.BarChartInfoEdbItemReq{
  183. EdbInfoId: newMappingInfo.EdbInfoId,
  184. Name: fmt.Sprint("M+", v.Month),
  185. NameEn: fmt.Sprint("M+", v.Month),
  186. Source: newMappingInfo.Source,
  187. }
  188. // 判断如果有配置,需要替换为配置内容
  189. xItem, ok := xDataItemMap[k]
  190. if ok && xItem.Name != "" {
  191. tmp.Name = xItem.Name
  192. tmp.NameEn = xItem.NameEn
  193. tmp.IsHide = xItem.IsHide
  194. }
  195. barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, tmp)
  196. }
  197. if regionType == `海外` {
  198. zlFutureGoodEdbMapping := &models.ChartEdbInfoMapping{
  199. EdbInfoId: zlFutureGoodEdbInfo.FutureGoodEdbInfoId,
  200. SourceName: zlFutureGoodEdbInfo.Exchange,
  201. Source: 0,
  202. EdbCode: zlFutureGoodEdbInfo.FutureGoodEdbCode,
  203. EdbName: zlFutureGoodEdbInfo.FutureGoodEdbName,
  204. EdbAliasName: zlFutureGoodEdbInfo.FutureGoodEdbName,
  205. EdbNameEn: zlFutureGoodEdbInfo.FutureGoodEdbNameEn,
  206. EdbType: baseEdbInfoMapping.EdbType,
  207. Frequency: baseEdbInfoMapping.Frequency,
  208. FrequencyEn: baseEdbInfoMapping.FrequencyEn,
  209. Unit: baseEdbInfoMapping.Unit,
  210. UnitEn: baseEdbInfoMapping.UnitEn,
  211. StartDate: zlFutureGoodEdbInfo.StartDate,
  212. EndDate: zlFutureGoodEdbInfo.EndDate,
  213. ModifyTime: zlFutureGoodEdbInfo.ModifyTime.Format(utils.FormatDateTime),
  214. ChartEdbMappingId: zlFutureGoodEdbInfo.FutureGoodEdbInfoId,
  215. ChartInfoId: baseEdbInfoMapping.ChartInfoId,
  216. MaxData: zlFutureGoodEdbInfo.MaxValue,
  217. MinData: zlFutureGoodEdbInfo.MinValue,
  218. IsOrder: baseEdbInfoMapping.IsOrder,
  219. IsAxis: baseEdbInfoMapping.IsAxis,
  220. EdbInfoType: baseEdbInfoMapping.EdbInfoType,
  221. EdbInfoCategoryType: baseEdbInfoMapping.EdbInfoCategoryType,
  222. LeadValue: baseEdbInfoMapping.LeadValue,
  223. LeadUnit: baseEdbInfoMapping.LeadUnit,
  224. LeadUnitEn: baseEdbInfoMapping.LeadUnitEn,
  225. ChartStyle: baseEdbInfoMapping.ChartStyle,
  226. ChartColor: baseEdbInfoMapping.ChartColor,
  227. PredictChartColor: baseEdbInfoMapping.PredictChartColor,
  228. ChartWidth: baseEdbInfoMapping.ChartWidth,
  229. ChartType: baseEdbInfoMapping.ChartType,
  230. LatestDate: zlFutureGoodEdbInfo.LatestDate.Format(utils.FormatDateTime),
  231. LatestValue: zlFutureGoodEdbInfo.LatestValue,
  232. UniqueCode: futureGoodEdbInfoMapping.UniqueCode + strconv.Itoa(0),
  233. MinValue: zlFutureGoodEdbInfo.MinValue,
  234. MaxValue: zlFutureGoodEdbInfo.MaxValue,
  235. DataList: nil,
  236. IsNullData: false,
  237. }
  238. edbList = append(edbList, zlFutureGoodEdbMapping)
  239. edbList = append(edbList, futureGoodMappingList...)
  240. } else {
  241. edbList = append(edbList, futureGoodMappingList...)
  242. }
  243. if !needData {
  244. return
  245. }
  246. // 获取数据
  247. // 现货数据
  248. for _, edbInfoMapping := range edbInfoMappingList {
  249. dataList := make([]*models.EdbDataList, 0)
  250. dataList, err = models.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.SubSource, edbInfoMapping.EdbInfoId, startDate, endDate)
  251. if err != nil {
  252. return
  253. }
  254. edbDataListMap[edbInfoMapping.EdbInfoId] = dataList
  255. // todo item
  256. //item.DataList = dataList
  257. }
  258. // 期货数据
  259. for _, v := range futureGoodMappingList {
  260. dataList := make([]*models.EdbDataList, 0)
  261. tmpDataList, tmpErr := future_good2.GetFutureGoodEdbDataListByDate(v.EdbInfoId, startDate, endDate)
  262. if tmpErr != nil {
  263. return
  264. }
  265. for _, tmpData := range tmpDataList {
  266. dataList = append(dataList, &models.EdbDataList{
  267. EdbDataId: tmpData.FutureGoodEdbDataId,
  268. EdbInfoId: tmpData.FutureGoodEdbInfoId,
  269. DataTime: tmpData.DataTime.Format(utils.FormatDate),
  270. DataTimestamp: tmpData.DataTimestamp,
  271. Value: tmpData.Close,
  272. })
  273. }
  274. edbDataListMap[v.EdbInfoId] = dataList
  275. v.DataList = dataList
  276. }
  277. xEdbIdValue, yDataList, err = BarChartData(baseEdbInfoMapping, edbInfoMappingList, futureGoodEdbInfoList, edbDataListMap, barChartInfoDateList, regionType, baseEdbInfoMapping.EndDate)
  278. if len(barChartInfoConf.XDataList) > 0 {
  279. xDataList = barChartInfoConf.XDataList
  280. } else {
  281. for _, v := range edbInfoMappingList {
  282. xDataList = append(xDataList, data_manage.XData{
  283. Name: v.EdbName,
  284. NameEn: v.EdbNameEn,
  285. IsHide: 0,
  286. })
  287. }
  288. }
  289. //yDataList =make([]models.YData,0)
  290. //models.YData{
  291. // Date: "",
  292. // Color: "",
  293. // Name: "",
  294. // NameEn: "",
  295. // Value: nil,
  296. // NoDataEdbList: nil,
  297. // XEdbInfoIdList: nil,
  298. //}
  299. futureGoodEdbInfoIndexMap := make(map[int]int)
  300. for index, v := range futureGoodEdbInfoList {
  301. futureGoodEdbInfoIndexMap[v.FutureGoodEdbInfoId] = index
  302. }
  303. nMap := make(map[int]int)
  304. maxIndex := 0 // 最大x轴的下标
  305. for k, tmpYData := range yDataList {
  306. yDataMap := tmpYData.EdbValMap
  307. edbInfoIdList := make([]int, 0)
  308. noDataEdbInfoIdList := make([]int, 0)
  309. valueList := make([]float64, 0)
  310. noDataEdbIdMap := make(map[int]int)
  311. // 所有的N值
  312. for _, n := range tmpYData.M {
  313. nMap[n] = n
  314. }
  315. // 基础指标
  316. {
  317. edbInfoIdList = append(edbInfoIdList, baseEdbInfoId)
  318. tmpVal, ok := yDataMap[baseEdbInfoId]
  319. valueList = append(valueList, tmpVal)
  320. if !ok || tmpVal == 0 {
  321. noDataEdbInfoIdList = append(noDataEdbInfoIdList, baseEdbInfoId)
  322. noDataEdbIdMap[baseEdbInfoId] = baseEdbInfoId
  323. }
  324. }
  325. for _, futureGoodEdbInfo := range futureGoodEdbInfoList {
  326. tmpEdbInfId := futureGoodEdbInfo.FutureGoodEdbInfoId
  327. edbInfoIdList = append(edbInfoIdList, tmpEdbInfId)
  328. tmpVal, ok := yDataMap[tmpEdbInfId]
  329. valueList = append(valueList, tmpVal)
  330. if !ok || tmpVal == 0 {
  331. noDataEdbInfoIdList = append(noDataEdbInfoIdList, tmpEdbInfId)
  332. noDataEdbIdMap[tmpEdbInfId] = tmpEdbInfId
  333. }
  334. }
  335. //tmpYData.Value = valueList
  336. tmpYData.NoDataEdbList = noDataEdbInfoIdList
  337. yDataList[k] = tmpYData
  338. lenEdbId := len(edbInfoIdList)
  339. tmpMaxIndex := lenEdbId - 1 // 当前数据的最大x轴的下标
  340. for i := lenEdbId - 1; i >= 0; i-- {
  341. // 如果没有在无数据的指标列表中找到,那么就找到了最大x轴的下标
  342. if _, ok := noDataEdbIdMap[edbInfoIdList[i]]; !ok {
  343. // 如果最大x轴的下标 小于 当前下标,那么就重新赋值
  344. if maxIndex < i-1 {
  345. maxIndex = i - 1
  346. }
  347. break
  348. }
  349. tmpMaxIndex = i - 1
  350. }
  351. // 如果最大x轴的下标 小于 当前下标,那么就重新赋值
  352. if maxIndex < tmpMaxIndex {
  353. maxIndex = tmpMaxIndex
  354. }
  355. }
  356. //xEdbIdValue = xEdbIdValue[0:maxIndex]
  357. // 找出所有的N值,并进行正序排列
  358. nList := make([]int, 0)
  359. for _, n := range nMap {
  360. nList = append(nList, n)
  361. }
  362. sort.Slice(nList, func(i, j int) bool {
  363. return nList[i] < nList[j]
  364. })
  365. for k, v := range yDataList {
  366. if len(v.XEdbInfoIdList) >= maxIndex+1 {
  367. yDataList[k].XEdbInfoIdList = v.XEdbInfoIdList[0 : maxIndex+1]
  368. }
  369. if len(v.Value) >= maxIndex+1 {
  370. yDataList[k].Value = v.Value[0 : maxIndex+1]
  371. }
  372. }
  373. tmpXDataList, newYDataList, err := handleResultData(regionType, futureGoodEdbType, yDataList, futureGoodEdbInfoList, maxIndex)
  374. if err != nil {
  375. return
  376. }
  377. if len(barChartInfoConf.XDataList) == 0 {
  378. xDataList = append(xDataList, tmpXDataList...)
  379. }
  380. yDataList = newYDataList
  381. return
  382. }
  383. // BarChartData 获取数据
  384. func BarChartData(baseEdbInfoMapping *models.ChartEdbInfoMapping, edbInfoMappingList []*models.ChartEdbInfoMapping, futureGoodMappingList []*future_good2.FutureGoodEdbInfo, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, regionType, latestDate string) (edbIdList []int, yDataList []models.YData, err error) {
  385. // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
  386. // 现货指标数据map
  387. baseEdbDataMap := make(map[int]map[string]float64)
  388. edbInfoMappingMap := make(map[int]struct{})
  389. for _, v := range edbInfoMappingList {
  390. edbInfoMappingMap[v.EdbInfoId] = struct{}{}
  391. }
  392. for edbInfoId, edbDataList := range edbDataListMap {
  393. if _, ok1 := edbInfoMappingMap[edbInfoId]; ok1 {
  394. edbDateData := make(map[string]float64)
  395. for _, edbData := range edbDataList {
  396. edbDateData[edbData.DataTime] = edbData.Value
  397. }
  398. baseEdbDataMap[edbInfoId] = edbDateData
  399. }
  400. }
  401. // 期货指标数据map
  402. futureGoodEdbDataMap := make(map[int]map[string]float64)
  403. for edbInfoId, edbDataList := range edbDataListMap {
  404. if _, ok := edbInfoMappingMap[edbInfoId]; ok {
  405. continue
  406. }
  407. edbDateData := make(map[string]float64)
  408. for _, edbData := range edbDataList {
  409. edbDateData[edbData.DataTime] = edbData.Value
  410. }
  411. futureGoodEdbDataMap[edbInfoId] = edbDateData
  412. }
  413. // edbIdList 指标展示顺序;x轴的指标顺序
  414. edbIdList = make([]int, 0)
  415. for _, v := range edbInfoMappingList {
  416. edbIdList = append(edbIdList, v.EdbInfoId)
  417. }
  418. for _, v := range futureGoodMappingList {
  419. edbIdList = append(edbIdList, v.FutureGoodEdbInfoId)
  420. }
  421. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
  422. yDataList = make([]models.YData, 0) //y轴的数据列表
  423. for _, barChartInfoDate := range barChartInfoDateList {
  424. yDataMap := make(map[int]float64)
  425. var maxDate time.Time
  426. var findDateTime time.Time
  427. switch barChartInfoDate.Type {
  428. case 1: //最新值
  429. findDateTime = latestDateTime
  430. case 2: //近期几天
  431. findDateTime = latestDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  432. case 3: // 固定日期
  433. //寻找固定日期的数据
  434. tmpFindDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  435. if tmpErr != nil {
  436. err = tmpErr
  437. return
  438. }
  439. findDateTime = tmpFindDateTime
  440. default:
  441. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  442. return
  443. }
  444. if findDateTime.IsZero() {
  445. err = errors.New("错误的日期")
  446. return
  447. }
  448. findDataList := make([]float64, 0) // 当前日期的数据值
  449. noDataIdList := make([]int, 0) // 没有数据的指标id
  450. noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
  451. xEdbInfoIdList := make([]int, 0) // 当前数据的指标id列表
  452. // 先找到基准日期
  453. var realDateTime time.Time
  454. realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[baseEdbInfoMapping.EdbInfoId], baseEdbDataMap[baseEdbInfoMapping.EdbInfoId], futureGoodEdbDataMap)
  455. if tmpErr != nil {
  456. err = tmpErr
  457. return
  458. }
  459. // 处理其余现货指标
  460. for _, v := range edbInfoMappingList {
  461. if v.EdbInfoId == baseEdbInfoMapping.EdbInfoId {
  462. findDataList = append(findDataList, findDataValue)
  463. yDataMap[baseEdbInfoMapping.EdbInfoId] = findDataValue
  464. if isFind {
  465. maxDate = realDateTime
  466. } else {
  467. noDataIdList = append(noDataIdList, baseEdbInfoMapping.EdbInfoId)
  468. noDataIdMap[baseEdbInfoMapping.EdbInfoId] = baseEdbInfoMapping.EdbInfoId
  469. }
  470. continue
  471. }
  472. tmpRealDateTime, findDataValueTmp, isFindTmp, e := GetNeedDateData(realDateTime, edbDataListMap[v.EdbInfoId], baseEdbDataMap[v.EdbInfoId], futureGoodEdbDataMap)
  473. if e != nil {
  474. err = e
  475. return
  476. }
  477. findDataList = append(findDataList, findDataValueTmp)
  478. yDataMap[v.EdbInfoId] = findDataValue
  479. if isFindTmp {
  480. // todo 是否需要变更 maxDate
  481. if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
  482. maxDate = tmpRealDateTime
  483. }
  484. } else {
  485. noDataIdList = append(noDataIdList, v.EdbInfoId)
  486. noDataIdMap[v.EdbInfoId] = v.EdbInfoId
  487. }
  488. xEdbInfoIdList = append(xEdbInfoIdList, v.EdbInfoId)
  489. }
  490. //currMonth := findDateTime.Month() // 当前月份
  491. //currYear := findDateTime.Year() // 当前年份
  492. // 用实际日期的月份作为基准,往前推12个月(2024-5-13 16:26:43修改)
  493. currMonth := realDateTime.Month() // 当前月份
  494. currYear := realDateTime.Year() // 当前年份
  495. mList := make([]int, 0) // 间隔月份
  496. indexList := make([]int, 0)
  497. if regionType == `国内` {
  498. for i := currMonth + 1; i <= 12; i++ {
  499. indexList = append(indexList, int(i))
  500. mList = append(mList, int(i-currMonth))
  501. }
  502. for i := 1; i < int(currMonth); i++ {
  503. indexList = append(indexList, i)
  504. mList = append(mList, 12+i-int(currMonth))
  505. }
  506. } else {
  507. for i, v := range futureGoodMappingList {
  508. if v.FutureGoodEdbType == 2 {
  509. if i == 0 {
  510. continue
  511. }
  512. indexList = append(indexList, i)
  513. mList = append(mList, v.Month)
  514. } else {
  515. if v.Year > currYear || (v.Year == currYear && v.Month > int(currMonth)) {
  516. indexList = append(indexList, i)
  517. mList = append(mList, (v.Year-currYear)*12+v.Month-int(currMonth))
  518. }
  519. }
  520. }
  521. }
  522. for _, i := range indexList {
  523. futureGoodMapping := futureGoodMappingList[i] // 当前的期货指标
  524. //tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[futureGoodMapping.FutureGoodEdbInfoId], edbDataMap[futureGoodMapping.FutureGoodEdbInfoId])
  525. //if tmpErr != nil {
  526. // err = tmpErr
  527. // return
  528. //}
  529. //tmpRealDateTime := findDateTime // 按照配置找到的日期
  530. tmpRealDateTime := realDateTime // 实际现货的日期
  531. tmpFindDataValue, tmpIsFind := futureGoodEdbDataMap[futureGoodMapping.FutureGoodEdbInfoId][tmpRealDateTime.Format(utils.FormatDate)]
  532. yDataMap[futureGoodMapping.FutureGoodEdbInfoId] = tmpFindDataValue
  533. findDataList = append(findDataList, tmpFindDataValue)
  534. if tmpIsFind {
  535. if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
  536. maxDate = tmpRealDateTime
  537. }
  538. } else {
  539. noDataIdList = append(noDataIdList, futureGoodMapping.FutureGoodEdbInfoId)
  540. noDataIdMap[futureGoodMapping.FutureGoodEdbInfoId] = futureGoodMapping.FutureGoodEdbInfoId
  541. }
  542. // 当前期货合约的指标
  543. xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.FutureGoodEdbInfoId)
  544. }
  545. yName := barChartInfoDate.Name
  546. yNameEn := barChartInfoDate.Name
  547. if yName == `` {
  548. if barChartInfoDate.Type == 2 {
  549. yName = strconv.Itoa(barChartInfoDate.Value) + "天前"
  550. if barChartInfoDate.Value == 1 {
  551. yNameEn = strconv.Itoa(barChartInfoDate.Value) + "day ago"
  552. } else {
  553. yNameEn = strconv.Itoa(barChartInfoDate.Value) + " days ago"
  554. }
  555. } else {
  556. yName = maxDate.Format(utils.FormatDate)
  557. yNameEn = maxDate.Format(utils.FormatDate)
  558. }
  559. }
  560. yDate := "0000-00-00"
  561. if !maxDate.IsZero() {
  562. yDate = maxDate.Format(utils.FormatDate)
  563. }
  564. // 数据处理,将没有数据的下标,赋值平均值
  565. {
  566. hasDataIndexList := make([]int, 0)
  567. for dataK, edbInfoId := range xEdbInfoIdList {
  568. if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
  569. hasDataIndexList = append(hasDataIndexList, dataK)
  570. }
  571. }
  572. lenHasDataIndex := len(hasDataIndexList)
  573. if lenHasDataIndex > 0 {
  574. for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
  575. perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
  576. currK := hasDataIndexList[lenHasDataI] //当前有数据的指标下标
  577. preVal := findDataList[perK] //上一个有数据的坐标的值
  578. currVal := findDataList[currK] //当前有数据的指标的值
  579. // 环差值
  580. hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
  581. var tmpI int64
  582. // 将两个中间的数据做平均值补全
  583. for hcI := perK + 1; hcI < currK; hcI++ {
  584. tmpI++
  585. findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
  586. }
  587. }
  588. }
  589. }
  590. yDataList = append(yDataList, models.YData{
  591. Date: yDate,
  592. ConfigDate: realDateTime,
  593. Value: findDataList,
  594. NoDataEdbList: noDataIdList,
  595. XEdbInfoIdList: xEdbInfoIdList,
  596. Color: barChartInfoDate.Color,
  597. Name: yName,
  598. NameEn: yNameEn,
  599. EdbValMap: yDataMap,
  600. M: mList,
  601. })
  602. }
  603. return
  604. }
  605. // handleResultData 处理成最终的结果数据
  606. func handleResultData(regionType string, futureGoodEdbType int, yDataList []models.YData, futureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, maxIndex int) (xDataList []data_manage.XData, newYDataList []models.YData, err error) {
  607. xDataList = make([]data_manage.XData, 0)
  608. newYDataList = yDataList
  609. if regionType == `国内` {
  610. for i := 1; i < 12; i++ {
  611. if i > maxIndex {
  612. break
  613. }
  614. // todo x轴 内容调整
  615. xDataList = append(xDataList, data_manage.XData{
  616. Name: fmt.Sprint("M+", i),
  617. NameEn: fmt.Sprint("M+", i),
  618. })
  619. }
  620. return
  621. }
  622. futureGoodEdbInfoMap := make(map[int]*future_good2.FutureGoodEdbInfo)
  623. for _, v := range futureGoodEdbInfoList {
  624. futureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = v
  625. }
  626. if futureGoodEdbType == 2 { // FutureGoodEdbType int `description:"指标类型,1:年月是固定的合约;2:只有M+N期的合约,未固定年月"`
  627. nList := []int{3, 15, 27}
  628. for _, i := range nList {
  629. xDataList = append(xDataList, data_manage.XData{
  630. Name: fmt.Sprint("M+", i),
  631. NameEn: fmt.Sprint("M+", i),
  632. })
  633. }
  634. for yIndex, yData := range yDataList {
  635. newYDataList[yIndex].XEdbInfoIdList = []int{}
  636. newYDataList[yIndex].Value = []float64{}
  637. tmpNList := nList
  638. //当前的主力合约
  639. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, yData.XEdbInfoIdList[0])
  640. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[0])
  641. xEdbInfoIdList := yData.XEdbInfoIdList[1:]
  642. valIndex := 1
  643. needNum := 0
  644. for _, n := range tmpNList {
  645. if len(xEdbInfoIdList) > 0 {
  646. edbInfoId := xEdbInfoIdList[0]
  647. futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
  648. if !ok {
  649. err = errors.New("找不到指标")
  650. return
  651. }
  652. // 当前距离最早的日期相差的N数
  653. if futureGoodEdbInfo.Month == n {
  654. if needNum > 0 {
  655. currVal := yData.Value[valIndex]
  656. preVal := yData.Value[valIndex-1]
  657. hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(needNum + 1)))
  658. for tmpNum := 0; tmpNum < needNum; tmpNum++ {
  659. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, 0)
  660. // 赋值平均值
  661. tmpVal, _ := decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(int64(tmpNum + 1)))).RoundCeil(4).Float64()
  662. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, tmpVal)
  663. }
  664. }
  665. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, edbInfoId)
  666. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[valIndex])
  667. valIndex++
  668. needNum = 0
  669. if len(xEdbInfoIdList) > 0 {
  670. xEdbInfoIdList = xEdbInfoIdList[1:]
  671. }
  672. } else {
  673. needNum++
  674. }
  675. }
  676. }
  677. }
  678. maxI := 0
  679. for _, yData := range newYDataList {
  680. lenEdb := len(yData.XEdbInfoIdList)
  681. for i := 0; i < lenEdb; i++ {
  682. if yData.XEdbInfoIdList[i] != 0 && !utils.InArrayByInt(yData.NoDataEdbList, yData.XEdbInfoIdList[i]) {
  683. if maxI < i {
  684. maxI = i
  685. }
  686. }
  687. }
  688. }
  689. xDataList = xDataList[0:maxI]
  690. for yIndex, yData := range newYDataList {
  691. if len(yData.XEdbInfoIdList) > maxI+1 {
  692. newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]
  693. }
  694. if len(yData.Value) > maxI+1 {
  695. newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
  696. }
  697. }
  698. return
  699. }
  700. nMap := make(map[int]int)
  701. for _, v := range yDataList {
  702. findDateTime := v.ConfigDate
  703. currMonth := findDateTime.Month() // 当前月份
  704. currYear := findDateTime.Year() // 当前年份
  705. //v.XEdbInfoIdList
  706. for edbInfoIndex, edbInfoId := range v.XEdbInfoIdList {
  707. // 第一个不处理
  708. if edbInfoIndex == 0 {
  709. continue
  710. }
  711. futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
  712. if !ok {
  713. err = errors.New("找不到指标")
  714. return
  715. }
  716. n := (futureGoodEdbInfo.Year-currYear)*12 + futureGoodEdbInfo.Month - int(currMonth)
  717. nMap[n] = n
  718. }
  719. }
  720. // 找出所有的N值,并进行正序排列
  721. nList := make([]int, 0)
  722. for _, n := range nMap {
  723. nList = append(nList, n)
  724. }
  725. sort.Slice(nList, func(i, j int) bool {
  726. return nList[i] < nList[j]
  727. })
  728. //prevMonth := 1
  729. for _, n := range nList {
  730. xDataList = append(xDataList, data_manage.XData{
  731. Name: fmt.Sprint("M+", n),
  732. NameEn: fmt.Sprint("M+", n),
  733. })
  734. }
  735. for yIndex, yData := range yDataList {
  736. newYDataList[yIndex].XEdbInfoIdList = []int{}
  737. newYDataList[yIndex].Value = []float64{}
  738. tmpNList := nList
  739. //当前的主力合约
  740. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, yData.XEdbInfoIdList[0])
  741. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[0])
  742. xEdbInfoIdList := yData.XEdbInfoIdList[1:]
  743. currDataTime := yData.ConfigDate
  744. valIndex := 1
  745. needNum := 0
  746. for _, n := range tmpNList {
  747. if len(xEdbInfoIdList) > 0 {
  748. edbInfoId := xEdbInfoIdList[0]
  749. futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
  750. if !ok {
  751. err = errors.New("找不到指标")
  752. return
  753. }
  754. // 当前距离最早的日期相差的N数
  755. divMonth := (futureGoodEdbInfo.Year-currDataTime.Year())*12 + (futureGoodEdbInfo.Month - int(currDataTime.Month()))
  756. if divMonth == n {
  757. if needNum > 0 {
  758. currVal := yData.Value[valIndex]
  759. preVal := yData.Value[valIndex-1]
  760. hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(needNum + 1)))
  761. for tmpNum := 0; tmpNum < needNum; tmpNum++ {
  762. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, 0)
  763. // 赋值平均值
  764. tmpVal, _ := decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(int64(tmpNum + 1)))).RoundCeil(4).Float64()
  765. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, tmpVal)
  766. }
  767. }
  768. newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, edbInfoId)
  769. newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[valIndex])
  770. valIndex++
  771. needNum = 0
  772. if len(xEdbInfoIdList) > 0 {
  773. xEdbInfoIdList = xEdbInfoIdList[1:]
  774. }
  775. } else {
  776. needNum++
  777. }
  778. }
  779. }
  780. }
  781. maxI := 0
  782. for _, yData := range newYDataList {
  783. lenEdb := len(yData.XEdbInfoIdList)
  784. for i := 0; i < lenEdb; i++ {
  785. if yData.XEdbInfoIdList[i] != 0 && !utils.InArrayByInt(yData.NoDataEdbList, yData.XEdbInfoIdList[i]) {
  786. if maxI < i {
  787. maxI = i
  788. }
  789. }
  790. }
  791. }
  792. xDataList = xDataList[0:maxI]
  793. for yIndex, yData := range newYDataList {
  794. if len(yData.XEdbInfoIdList) > maxI+1 {
  795. newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]
  796. }
  797. if len(yData.Value) > maxI+1 {
  798. newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
  799. }
  800. }
  801. return
  802. }
  803. // getFutureGoodEdbInfoList 获取适用的指标列表
  804. func getFutureGoodEdbInfoList(latestDateTime time.Time, tmpFutureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, barChartInfoDateList []data_manage.BarChartInfoDateReq) (earliestDateTime time.Time, futureGoodEdbInfoList []*future_good2.FutureGoodEdbInfo, err error) {
  805. maxM := 36 //最大36期合约
  806. futureGoodEdbInfoList = make([]*future_good2.FutureGoodEdbInfo, 0)
  807. earliestDateTime = latestDateTime // 数据的最早日期,目的是为了找出最早的合约
  808. for _, barChartInfoDate := range barChartInfoDateList {
  809. var findDateTime time.Time
  810. switch barChartInfoDate.Type {
  811. case 1: //最新值
  812. findDateTime = latestDateTime
  813. case 2: //近期几天
  814. findDateTime = latestDateTime.AddDate(0, 0, -barChartInfoDate.Value)
  815. case 3: // 固定日期
  816. //寻找固定日期的数据
  817. tmpFindDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
  818. if tmpErr != nil {
  819. err = tmpErr
  820. return
  821. }
  822. findDateTime = tmpFindDateTime
  823. default:
  824. err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
  825. return
  826. }
  827. if findDateTime.IsZero() {
  828. err = errors.New("错误的日期")
  829. return
  830. }
  831. if findDateTime.Before(earliestDateTime) {
  832. earliestDateTime = findDateTime
  833. }
  834. }
  835. for _, v := range tmpFutureGoodEdbInfoList {
  836. if v.RegionType == `国内` {
  837. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  838. continue
  839. }
  840. //海外的连续日期,目前
  841. if v.FutureGoodEdbType == 2 {
  842. if v.Month <= maxM {
  843. //addMonth := int(earliestDateTime.Month()) + v.Month
  844. //v.Year = earliestDateTime.Year() + addMonth/12
  845. //realMonth := addMonth % 12
  846. //if realMonth == 0 {
  847. // realMonth = 12
  848. //}
  849. //v.Month = realMonth
  850. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  851. }
  852. continue
  853. }
  854. if v.Year < earliestDateTime.Year() {
  855. continue
  856. }
  857. // 小于等于当前年,那么就肯定是ok的
  858. if v.Year <= earliestDateTime.Year() {
  859. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  860. continue
  861. }
  862. // 如果(当前年-最新日期的年份) * 12个月 + (当前月-最新日期的月份) 小于总月份
  863. if (v.Year-earliestDateTime.Year())*12+(v.Month-int(earliestDateTime.Month())) <= maxM {
  864. futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
  865. continue
  866. }
  867. }
  868. return
  869. }
  870. // GetNeedDateData 获取合约内需要的日期数据
  871. func GetNeedDateData(needDateTime time.Time, dataList []*models.EdbDataList, edbDataMap map[string]float64, allEdbDataMap map[int]map[string]float64) (findDateTime time.Time, findDataValue float64, isFind bool, err error) {
  872. //dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  873. if len(dataList) <= 0 {
  874. // 没有数据的指标id
  875. return
  876. }
  877. //最早的日期
  878. minDateTime, err := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  879. if err != nil {
  880. return
  881. }
  882. // 该日期存在数据的期货指标的最小数量,目前是现货和期货各1个,总共2个
  883. maxCount := 1
  884. for tmpDateTime := needDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  885. tmpDate := tmpDateTime.Format(utils.FormatDate)
  886. tmpValue, ok := edbDataMap[tmpDate]
  887. if !ok {
  888. continue
  889. }
  890. // 该日期存在数据的指标数量
  891. count := 0
  892. for _, currEdbDataMap := range allEdbDataMap {
  893. _, tmpIsFind := currEdbDataMap[tmpDate]
  894. if tmpIsFind {
  895. count++
  896. if count >= maxCount {
  897. continue
  898. }
  899. }
  900. }
  901. // 该日期存在数据的期货指标数量小于2个,那么要继续往前找
  902. if count < maxCount {
  903. continue
  904. }
  905. //如果能找到数据,那么就返回
  906. // 数据为0,也直接返回,做无值处理
  907. if tmpValue == 0 {
  908. return
  909. }
  910. findDateTime, _ = time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
  911. findDataValue = tmpValue
  912. isFind = true
  913. return
  914. }
  915. return
  916. }
  917. // FutureGoodChartInfoRefresh
  918. // @author Roc
  919. // @datetime 2023-2-2 18:44:46
  920. // @description 商品价格曲线图表刷新
  921. func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
  922. var errMsg string
  923. defer func() {
  924. if err != nil {
  925. go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
  926. fmt.Println("ChartInfoRefresh Err:" + errMsg)
  927. }
  928. }()
  929. edbInfoMappingList, err := models.GetEtaEdbChartEdbMappingList(chartInfoId)
  930. if err != nil {
  931. errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
  932. return
  933. }
  934. edbInfoIds := make([]int, 0)
  935. for _, edbInfoMapping := range edbInfoMappingList {
  936. edbInfoIds = append(edbInfoIds, edbInfoMapping.EdbInfoId)
  937. }
  938. // 获取期货指标
  939. futureGoodEdbInfoMapping, err := models.GetFutureGoodEdbChartEdbMapping(chartInfoId)
  940. if err != nil {
  941. errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
  942. return
  943. }
  944. // 获取期货指标以及期货数据
  945. futureGoodEdbInfoList, err := future_good2.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
  946. if err != nil {
  947. return
  948. }
  949. // 批量刷新ETA指标
  950. err, _ = data.EdbInfoRefreshAllFromBase(edbInfoIds, false)
  951. if err != nil {
  952. return
  953. }
  954. // 批量刷新期货指标
  955. err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
  956. if err != nil {
  957. return
  958. }
  959. return
  960. }