Browse Source

fix:恢复

Roc 1 year ago
parent
commit
c1e41aa119
1 changed files with 104 additions and 196 deletions
  1. 104 196
      services/data/future_good/chart_info.go

+ 104 - 196
services/data/future_good/chart_info.go

@@ -90,6 +90,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
 	var zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo
 	var latestDate string // 最新日期是这个
 	var regionType string // 交易所来源:“国内”,“海外”
+	var futureGoodEdbType int
 	{
 		// 寻找主力合约
 		zlFutureGoodEdbInfo, err = future_good.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
@@ -97,6 +98,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
 			return
 		}
 		regionType = zlFutureGoodEdbInfo.RegionType
+		futureGoodEdbType = zlFutureGoodEdbInfo.FutureGoodEdbType
 
 		// 如果当前合约配置的 "画图时,日期来源的指标id" 并不是自己的话,那么就去查找对应配置的合约
 		if zlFutureGoodEdbInfo.DateSourceId != zlFutureGoodEdbInfo.FutureGoodEdbInfoId {
@@ -306,7 +308,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
 		}
 	}
 
-	tmpXDataList, newYDataList, err := handleResultData(regionType, yDataList, futureGoodEdbInfoList, maxIndex)
+	tmpXDataList, newYDataList, err := handleResultData(regionType, futureGoodEdbType, yDataList, futureGoodEdbInfoList, maxIndex)
 	if err != nil {
 		return
 	}
@@ -316,191 +318,6 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping,
 	return
 }
 
-// BarChartData 柱方图的数据处理
-//func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingList []*models.ChartEdbInfoMapping, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbIdList []int, yDataList []models.YData, err error) {
-//	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
-//	edbDataMap := make(map[int]map[string]float64)
-//	for edbInfoId, edbDataList := range edbDataListMap {
-//		edbDateData := make(map[string]float64)
-//		for _, edbData := range edbDataList {
-//			edbDateData[edbData.DataTime] = edbData.Value
-//		}
-//		edbDataMap[edbInfoId] = edbDateData
-//	}
-//
-//	// edbIdList 指标展示顺序;x轴的指标顺序
-//	edbIdList = make([]int, 0)
-//	edbIdList = append(edbIdList, edbInfoMapping.EdbInfoId)
-//	if barChartInfoSort.Sort == 0 {
-//		for _, v := range futureGoodMappingList {
-//			edbIdList = append(edbIdList, v.EdbInfoId)
-//		}
-//	}
-//
-//	//固定取螺纹期货主力合约的时间序列,最新值为该合约最新日期、N天前为该合约最新日期N天前
-//	rbzlInfo, err := future_good.GetFutureGoodEdbInfoByCode("RBZL.SHF")
-//	if err != nil {
-//		return
-//	}
-//	latestDate := rbzlInfo.EndDate // 最新日期是这个
-//	if rbzlInfo.EndDate == `0000-00-00` {
-//		err = errors.New("日期异常")
-//		return
-//	}
-//	latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
-//
-//	yDataList = make([]models.YData, 0) //y轴的数据列表
-//
-//	for _, barChartInfoDate := range barChartInfoDateList {
-//		var maxDate time.Time
-//		var findDateTime time.Time
-//		switch barChartInfoDate.Type {
-//		case 1: //最新值
-//			findDateTime = latestDateTime
-//		case 2: //近期几天
-//			findDateTime = latestDateTime.AddDate(0, 0, -barChartInfoDate.Value)
-//		case 3: // 固定日期
-//			//寻找固定日期的数据
-//			tmpFindDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
-//			if tmpErr != nil {
-//				err = tmpErr
-//				return
-//			}
-//			findDateTime = tmpFindDateTime
-//		default:
-//			err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
-//			return
-//		}
-//		if findDateTime.IsZero() {
-//			err = errors.New("错误的日期")
-//			return
-//		}
-//
-//		findDataList := make([]float64, 0)  // 当前日期的数据值
-//		noDataIdList := make([]int, 0)      // 没有数据的指标id
-//		noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
-//		xEdbInfoIdList := make([]int, 0)    // 当前数据的指标id列表
-//
-//		// 现货指标
-//		realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[edbInfoMapping.EdbInfoId], edbDataMap[edbInfoMapping.EdbInfoId])
-//		if tmpErr != nil {
-//			err = tmpErr
-//			return
-//		}
-//		findDataList = append(findDataList, findDataValue)
-//		if isFind {
-//			maxDate = realDateTime
-//		} else {
-//			noDataIdList = append(noDataIdList, edbInfoMapping.EdbInfoId)
-//			noDataIdMap[edbInfoMapping.EdbInfoId] = edbInfoMapping.EdbInfoId
-//		}
-//		currMonth := findDateTime.Month() // 当前月份
-//		xEdbInfoIdList = append(xEdbInfoIdList, edbInfoMapping.EdbInfoId)
-//
-//		// 当前月的后面月份合约的数据
-//		for i := currMonth; i < 12; i++ {
-//			futureGoodMapping := futureGoodMappingList[i] // 当前的期货指标
-//			tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[futureGoodMapping.EdbInfoId], edbDataMap[futureGoodMapping.EdbInfoId])
-//			if tmpErr != nil {
-//				err = tmpErr
-//				return
-//			}
-//			findDataList = append(findDataList, tmpFindDataValue)
-//			if tmpIsFind {
-//				if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
-//					maxDate = tmpRealDateTime
-//				}
-//			} else {
-//				noDataIdList = append(noDataIdList, futureGoodMapping.EdbInfoId)
-//				noDataIdMap[futureGoodMapping.EdbInfoId] = futureGoodMapping.EdbInfoId
-//			}
-//			// 当前期货合约的指标
-//			xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.EdbInfoId)
-//		}
-//
-//		// 当前月的前面月份合约的数据
-//		for i := 1; i < int(currMonth); i++ {
-//			futureGoodMapping := futureGoodMappingList[i-1] // 当前的期货指标
-//			tmpRealDateTime, tmpFindDataValue, tmpIsFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[futureGoodMapping.EdbInfoId], edbDataMap[futureGoodMapping.EdbInfoId])
-//			if tmpErr != nil {
-//				err = tmpErr
-//				return
-//			}
-//			findDataList = append(findDataList, tmpFindDataValue)
-//			if tmpIsFind {
-//				if maxDate.IsZero() || maxDate.Before(tmpRealDateTime) {
-//					maxDate = tmpRealDateTime
-//				}
-//			} else {
-//				noDataIdList = append(noDataIdList, futureGoodMapping.EdbInfoId)
-//				noDataIdMap[futureGoodMapping.EdbInfoId] = futureGoodMapping.EdbInfoId
-//			}
-//			// 当前期货合约的指标
-//			xEdbInfoIdList = append(xEdbInfoIdList, futureGoodMapping.EdbInfoId)
-//		}
-//
-//		yName := barChartInfoDate.Name
-//		yNameEn := barChartInfoDate.Name
-//		if yName == `` {
-//			if barChartInfoDate.Type == 2 {
-//				yName = strconv.Itoa(barChartInfoDate.Value) + "天前"
-//				if barChartInfoDate.Value == 1 {
-//					yNameEn = strconv.Itoa(barChartInfoDate.Value) + "day ago"
-//				} else {
-//					yNameEn = strconv.Itoa(barChartInfoDate.Value) + " days ago"
-//				}
-//			} else {
-//				yName = maxDate.Format(utils.FormatDate)
-//				yNameEn = maxDate.Format(utils.FormatDate)
-//			}
-//		}
-//		yDate := "0000-00-00"
-//		if !maxDate.IsZero() {
-//			yDate = maxDate.Format(utils.FormatDate)
-//		}
-//
-//		// 数据处理,将没有数据的下标,赋值平均值
-//		{
-//			hasDataIndexList := make([]int, 0)
-//			for dataK, edbInfoId := range xEdbInfoIdList {
-//				if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
-//					hasDataIndexList = append(hasDataIndexList, dataK)
-//				}
-//			}
-//			lenHasDataIndex := len(hasDataIndexList)
-//			if lenHasDataIndex > 0 {
-//				for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
-//					perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
-//					currK := hasDataIndexList[lenHasDataI]  //当前有数据的指标下标
-//					preVal := findDataList[perK]            //上一个有数据的坐标的值
-//					currVal := findDataList[currK]          //当前有数据的指标的值
-//
-//					// 环差值
-//					hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
-//					var tmpI int64
-//					// 将两个中间的数据做平均值补全
-//					for hcI := perK + 1; hcI < currK; hcI++ {
-//						tmpI++
-//						findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
-//					}
-//				}
-//			}
-//		}
-//
-//		yDataList = append(yDataList, models.YData{
-//			Date:           yDate,
-//			Value:          findDataList,
-//			NoDataEdbList:  noDataIdList,
-//			XEdbInfoIdList: xEdbInfoIdList,
-//			Color:          barChartInfoDate.Color,
-//			Name:           yName,
-//			NameEn:         yNameEn,
-//		})
-//	}
-//
-//	return
-//}
-
 // BarChartData 柱方图的数据处理
 func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingList []*future_good.FutureGoodEdbInfo, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, regionType, latestDate string) (edbIdList []int, yDataList []models.YData, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
@@ -586,9 +403,17 @@ func BarChartData(edbInfoMapping *models.ChartEdbInfoMapping, futureGoodMappingL
 			}
 		} else {
 			for i, v := range futureGoodMappingList {
-				if v.Year > currYear || (v.Year == currYear && v.Month > int(currMonth)) {
+				if v.FutureGoodEdbType == 2 {
+					if i == 0 {
+						continue
+					}
 					indexList = append(indexList, i)
-					mList = append(mList, (v.Year-currYear)*12+v.Month-int(currMonth))
+					mList = append(mList, v.Month)
+				} else {
+					if v.Year > currYear || (v.Year == currYear && v.Month > int(currMonth)) {
+						indexList = append(indexList, i)
+						mList = append(mList, (v.Year-currYear)*12+v.Month-int(currMonth))
+					}
 				}
 			}
 		}
@@ -760,7 +585,7 @@ func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
 }
 
 // handleResultData 处理成最终的结果数据
-func handleResultData(regionType string, yDataList []models.YData, futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, maxIndex int) (xDataList []models.XData, newYDataList []models.YData, err error) {
+func handleResultData(regionType string, futureGoodEdbType int, yDataList []models.YData, futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, maxIndex int) (xDataList []models.XData, newYDataList []models.YData, err error) {
 	xDataList = make([]models.XData, 0)
 	newYDataList = yDataList
 
@@ -782,6 +607,89 @@ func handleResultData(regionType string, yDataList []models.YData, futureGoodEdb
 		futureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = v
 	}
 
+	if futureGoodEdbType == 2 { // 	FutureGoodEdbType   int       `description:"指标类型,1:年月是固定的合约;2:只有M+N期的合约,未固定年月"`
+		nList := []int{3, 15, 27}
+		for _, i := range nList {
+			xDataList = append(xDataList, models.XData{
+				Name:   fmt.Sprint("M+", i),
+				NameEn: fmt.Sprint("M+", i),
+			})
+		}
+
+		for yIndex, yData := range yDataList {
+			newYDataList[yIndex].XEdbInfoIdList = []int{}
+			newYDataList[yIndex].Value = []float64{}
+			tmpNList := nList
+
+			//当前的主力合约
+			newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, yData.XEdbInfoIdList[0])
+			newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[0])
+
+			xEdbInfoIdList := yData.XEdbInfoIdList[1:]
+			valIndex := 1
+			needNum := 0
+			for _, n := range tmpNList {
+				if len(xEdbInfoIdList) > 0 {
+					edbInfoId := xEdbInfoIdList[0]
+					futureGoodEdbInfo, ok := futureGoodEdbInfoMap[edbInfoId]
+					if !ok {
+						err = errors.New("找不到指标")
+						return
+					}
+					// 当前距离最早的日期相差的N数
+					if futureGoodEdbInfo.Month == n {
+						if needNum > 0 {
+							currVal := yData.Value[valIndex]
+							preVal := yData.Value[valIndex-1]
+							hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(needNum + 1)))
+
+							for tmpNum := 0; tmpNum < needNum; tmpNum++ {
+								newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, 0)
+
+								// 赋值平均值
+								tmpVal, _ := decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(int64(tmpNum + 1)))).RoundCeil(4).Float64()
+								newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, tmpVal)
+							}
+						}
+
+						newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, edbInfoId)
+						newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[valIndex])
+						valIndex++
+						needNum = 0
+						if len(xEdbInfoIdList) > 0 {
+							xEdbInfoIdList = xEdbInfoIdList[1:]
+						}
+					} else {
+						needNum++
+					}
+				}
+			}
+		}
+
+		maxI := 0
+		for _, yData := range newYDataList {
+			lenEdb := len(yData.XEdbInfoIdList)
+			for i := 0; i < lenEdb; i++ {
+				if yData.XEdbInfoIdList[i] != 0 && !utils.InArrayByInt(yData.NoDataEdbList, yData.XEdbInfoIdList[i]) {
+					if maxI < i {
+						maxI = i
+					}
+				}
+			}
+		}
+
+		xDataList = xDataList[0:maxI]
+		for yIndex, yData := range newYDataList {
+			if len(yData.XEdbInfoIdList) > maxI+1 {
+				newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]
+			}
+			if len(yData.Value) > maxI+1 {
+				newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
+			}
+		}
+		return
+	}
+
 	nMap := make(map[int]int)
 
 	for _, v := range yDataList {
@@ -942,13 +850,13 @@ func getFutureGoodEdbInfoList(latestDateTime time.Time, tmpFutureGoodEdbInfoList
 		//海外的连续日期,目前
 		if v.FutureGoodEdbType == 2 {
 			if v.Month <= maxM {
-				addMonth := int(earliestDateTime.Month()) + v.Month
-				v.Year = earliestDateTime.Year() + addMonth/12
-				realMonth := addMonth % 12
-				if realMonth == 0 {
-					realMonth = 12
-				}
-				v.Month = realMonth
+				//addMonth := int(earliestDateTime.Month()) + v.Month
+				//v.Year = earliestDateTime.Year() + addMonth/12
+				//realMonth := addMonth % 12
+				//if realMonth == 0 {
+				//	realMonth = 12
+				//}
+				//v.Month = realMonth
 				futureGoodEdbInfoList = append(futureGoodEdbInfoList, v)
 			}
 			continue