Bläddra i källkod

Merge branch 'hotfix/bug5322_future_good_profit' of eta_server/eta_index_lib into master

xyxie 2 dagar sedan
förälder
incheckning
8cd0ae8e8a
1 ändrade filer med 78 tillägg och 42 borttagningar
  1. 78 42
      logic/profit_chart_info.go

+ 78 - 42
logic/profit_chart_info.go

@@ -241,6 +241,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 	}
 	// 指标对应的所有数据
 	//edbDataListMap := make(map[int][]*models.EdbDataList)
+
 	// 普通的指标数据
 	baseDataListMap := make(map[int][]*models.EdbDataList)
 	for _, v := range edbInfoList {
@@ -254,7 +255,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 
 	latestDate := zlFutureGoodEdbInfoList[0].EndDate
 	latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
-
+	findDateTimeList := make([]time.Time, 0)
 	earliestDateTime := latestDateTime // 数据的最早日期,目的是为了找出最早的合约
 	for _, barChartInfoDate := range chartInfoDateList {
 		var findDateTime time.Time
@@ -280,14 +281,19 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 			return
 		}
 		if findDateTime.Before(earliestDateTime) {
-			earliestDateTime = findDateTime
+		 	earliestDateTime = findDateTime
 		}
+
+		findDateTimeList = append(findDateTimeList, findDateTime)
 	}
 
-	monthNum := (latestDateTime.Year()-earliestDateTime.Year())*12 + int(latestDateTime.Month()-earliestDateTime.Month())
+	monthNumMap := make(map[string]int)
+	for _, findDateTimeTmp := range findDateTimeList {
+		monthNumMap[findDateTimeTmp.Format(utils.FormatDate)] = (latestDateTime.Year()-findDateTimeTmp.Year())*12 + int(latestDateTime.Month()-findDateTimeTmp.Month())
+	}
 
 	// 存储主力合约下的所有月份合约
-	futureGoodEdbInfoDateMap := make(map[int]map[string]*future_good.FutureGoodEdbInfo)
+	futureGoodEdbInfoDateAllMap := make(map[int]map[string]map[string]*future_good.FutureGoodEdbInfo)
 	futureGoodDataListMap := make(map[int][]*models.EdbDataList, 0)
 	// 特殊的商品期货合约(只有M+N的合约,没有固定日期的合约)
 	specialFutureGoodEdbInfoMap := make(map[int]map[int]*future_good.FutureGoodEdbInfo, 0)
@@ -300,7 +306,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 		}
 	}
 
-	nMap := make(map[string]string)
+	nAllMap := make(map[string][]string)
 	var maxN int // 最大N值
 	for _, v := range zlFutureGoodEdbInfoList {
 		// 如果不是有效的商品期货指标,那么就过滤掉,不做数据查询处理,避免没必要的请求
@@ -314,53 +320,58 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 			return
 		}
 
-		childFutureGoodEdbInfoMap, tmpMaxN, tmpErr := getProfitFutureGoodEdbInfoList(earliestDateTime, v, tmpFutureGoodEdbInfoList, isAllChina, monthNum)
+		childFutureGoodEdbInfoAllMap, tmpMaxN, tmpErr := GetProfitFutureGoodEdbInfoList(findDateTimeList, v, tmpFutureGoodEdbInfoList, isAllChina, monthNumMap)
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
+	
 		if maxN < tmpMaxN {
 			maxN = tmpMaxN
 		}
-		futureGoodEdbInfoDateMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoMap
+		
+		futureGoodEdbInfoDateAllMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoAllMap
 
 		if v.FutureGoodEdbType == 2 {
 			specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = make(map[int]*future_good.FutureGoodEdbInfo)
 		}
 		// 获取数据
-		for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
-			nMap[date] = date
-			dataList := make([]*models.EdbDataList, 0)
-
-			tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
-			if tmpErr != nil {
-				return
-			}
-			for _, tmpData := range tmpDataList {
-				dataList = append(dataList, &models.EdbDataList{
-					EdbDataId:     tmpData.FutureGoodEdbDataId,
-					EdbInfoId:     tmpData.FutureGoodEdbInfoId,
-					DataTime:      tmpData.DataTime.Format(utils.FormatDate),
-					DataTimestamp: tmpData.DataTimestamp,
-					Value:         tmpData.Close,
-				})
-			}
-			futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId] = dataList
-
-			if childFutureGoodEdbInfo.FutureGoodEdbType == 2 {
-				specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId][childFutureGoodEdbInfo.Month] = childFutureGoodEdbInfo
+		for findDateTime, childFutureGoodEdbInfoMap := range childFutureGoodEdbInfoAllMap {
+			for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
+				nAllMap[findDateTime] = append(nAllMap[findDateTime], date)
+				dataList := make([]*models.EdbDataList, 0)
+				if _, ok := futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId]; !ok {
+					tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
+					if tmpErr != nil {
+						return
+					}
+					for _, tmpData := range tmpDataList {
+						dataList = append(dataList, &models.EdbDataList{
+							EdbDataId:     tmpData.FutureGoodEdbDataId,
+							EdbInfoId:     tmpData.FutureGoodEdbInfoId,
+							DataTime:      tmpData.DataTime.Format(utils.FormatDate),
+							DataTimestamp: tmpData.DataTimestamp,
+							Value:         tmpData.Close,
+						})
+					}
+					futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId] = dataList
+				}
+				if childFutureGoodEdbInfo.FutureGoodEdbType == 2 {
+					specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId][childFutureGoodEdbInfo.Month] = childFutureGoodEdbInfo
+				}
 			}
 		}
 	}
 
 	// 找出所有的N值,并进行正序排列
-	dateList := make([]string, 0)
-	for _, n := range nMap {
-		dateList = append(dateList, n)
+	dateListMap := make(map[string][]string, 0)
+	for key, dateList := range nAllMap {
+		sort.Slice(dateList, func(i, j int) bool {
+			return dateList[i] < dateList[j]
+		})
+		dateListMap[key] = dateList
 	}
-	sort.Slice(dateList, func(i, j int) bool {
-		return dateList[i] < dateList[j]
-	})
+	
 	var reqEdbInfoIds []int
 	for _, v := range edbInfoList {
 		reqEdbInfoIds = append(reqEdbInfoIds, v.EdbInfoId)
@@ -372,7 +383,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 	}
 	var edbIdList []int
 	futureGoodNameMap := make(map[int]map[int]string)
-	edbIdList, yDataList, futureGoodNameMap, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN, reqEdbInfoIds)
+	edbIdList, yDataList, futureGoodNameMap, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateAllMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateListMap, maxN, reqEdbInfoIds)
 
 	// todo 最后处理数据
 	tmpXDataList, newYDataList, err := handleProfitResultData(xDataList, futureGoodNameMap, yDataList, earliestDateTime, edbIdList)
@@ -391,7 +402,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 }
 
 // ProfitChartChartData 获取数据
-func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][]*models.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateList []string, maxN int, reqEdbInfoIds []int) (edbIdList []int, yDataList []YData, futureGoodNameMap map[int]map[int]string, err error) {
+func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][]*models.EdbDataList, futureGoodEdbInfoAllMap map[int]map[string]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateListMap map[string][]string, maxN int, reqEdbInfoIds []int) (edbIdList []int, yDataList []YData, futureGoodNameMap map[int]map[int]string, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
 	//earliestDateTime time.Time
 	// ETA指标数据
@@ -470,6 +481,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 		if isFind {
 			maxDate = realDateTime
 		}
+		fmt.Println("findDateTime", findDateTime, "realDateTime", realDateTime, "findDataValue", findDataValue, "isFind", isFind)
 		edbIdList = make([]int, 0) //普通指标ID
 		for _, edbInfoId := range reqEdbInfoIds {
 			if edbInfoId == baseEdbInfo.EdbInfoId {
@@ -501,6 +513,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 		mList := make([]int, 0) // 间隔月份
 
 		tmpNameMap := make(map[int]string)
+		dateList := dateListMap[findDateTime.Format(utils.FormatDate)]
 		// 最小开始的n值
 		//minN := (findDateTime.Year()-earliestDateTime.Year())*12 + int(findDateTime.Month()-earliestDateTime.Month())
 		for _, date := range dateList {
@@ -514,17 +527,20 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 			// 获取当前日期相对开始日期的期数
 			tmpN := (currDate.Year()-realDateTime.Year())*12 + int(currDate.Month()-realDateTime.Month())
 			if tmpN <= 0 {
+				fmt.Println("realDateTime跳出循环",realDateTime,"tmpN", tmpN, "currDate", currDate, "realDateTime", realDateTime)
 				continue
 			}
 
 			// 如果期数大于最大期数,那么就退出当前匹配
 			if tmpN >= maxN {
+				fmt.Println("realDateTime跳出循环",realDateTime,"tmpN >= maxN",tmpN, "maxN", maxN)
 				break
 			}
 
 			zlAndChildEdbId := make(map[int]int)
 			childFutureGoodEdbInfoIdList := make([]int, 0)
-			for zlFutureGoodEdbInfoId, futureGoodEdbInfoList := range futureGoodEdbInfoMap {
+			for zlFutureGoodEdbInfoId, futureGoodEdbInfoListMap := range futureGoodEdbInfoAllMap {
+				futureGoodEdbInfoList := futureGoodEdbInfoListMap[findDateTime.Format(utils.FormatDate)]
 				// 判断是否特殊合约
 				if childFutureGoodEdbInfoIdMap, ok := specialFutureGoodEdbInfoMap[zlFutureGoodEdbInfoId]; ok {
 					if childFutureGoodEdbInfo, ok2 := childFutureGoodEdbInfoIdMap[tmpN]; ok2 {
@@ -547,10 +563,14 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 
 			calculateMap := make(map[int]float64)
 			for _, childFutureGoodEdbInfoId := range childFutureGoodEdbInfoIdList {
+				fmt.Println("查找childFutureGoodEdbInfoId", childFutureGoodEdbInfoId,"日期为", realDateTime.Format(utils.FormatDate), "的值")
 				tmpFindDataValue, tmpIsFind := edbDataMap[childFutureGoodEdbInfoId][realDateTime.Format(utils.FormatDate)]
-
+				
 				if tmpIsFind && tmpFindDataValue != 0 {
 					calculateMap[childFutureGoodEdbInfoId] = tmpFindDataValue
+					fmt.Println("已找到tmpFindDataValue", tmpFindDataValue, "tmpIsFind", tmpIsFind)
+				} else {
+					fmt.Println("未找到tmpFindDataValue", tmpFindDataValue, "tmpIsFind", tmpIsFind)
 				}
 			}
 			// 合约的数据不全,不参与计算
@@ -562,8 +582,8 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 
 			for tag, zlEdbId := range tagEdbIdMap {
 				if tag == "A" {
-					nameTmp := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbName, "(")
-					nameTmpEn := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbNameEn, "(")
+					nameTmp := strings.Split(futureGoodEdbInfoAllMap[zlEdbId][findDateTime.Format(utils.FormatDate)][date].FutureGoodEdbName, "(")
+					nameTmpEn := strings.Split(futureGoodEdbInfoAllMap[zlEdbId][findDateTime.Format(utils.FormatDate)][date].FutureGoodEdbNameEn, "(")
 					if len(nameTmp) > 1 && len(nameTmpEn) > 1 {
 						nameTmp[1] = strings.Trim(nameTmp[1], ")")
 						nameTmpEn[1] = strings.Trim(nameTmpEn[1], ")")
@@ -585,8 +605,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 			//calVal, err := calResult.Float64()
 			if e != nil {
 				err = errors.New("计算失败:获取计算值失败 Err:" + e.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return
+				utils.FileLog.Info("计算失败:获取计算值失败 Err:" + e.Error() + ";formulaStr:" + formulaFormStr)
 			}
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
@@ -732,6 +751,23 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 	return
 }
 
+func GetProfitFutureGoodEdbInfoList(earliestDateTimeList []time.Time, zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo, tmpFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, isAllChina bool, monthNumMap  map[string]int) (futureGoodEdbInfoDateAllMap map[string]map[string]*future_good.FutureGoodEdbInfo, newMaxN int, err error) {
+	futureGoodEdbInfoDateAllMap = make(map[string]map[string]*future_good.FutureGoodEdbInfo)
+	for _, earliestDateTime := range earliestDateTimeList {
+		futureGoodEdbInfoDateMap := make(map[string]*future_good.FutureGoodEdbInfo)
+		var newMaxNTmp int
+		futureGoodEdbInfoDateMap, newMaxNTmp, err = getProfitFutureGoodEdbInfoList(earliestDateTime, zlFutureGoodEdbInfo, tmpFutureGoodEdbInfoList, isAllChina, monthNumMap[earliestDateTime.Format(utils.FormatYearMonthDate)])
+		if err != nil {
+			return
+		}
+		if newMaxN < newMaxNTmp {
+			newMaxN = newMaxNTmp
+		}
+		futureGoodEdbInfoDateAllMap[earliestDateTime.Format(utils.FormatDate)] = futureGoodEdbInfoDateMap
+	}
+	return
+}
+
 // handleProfitResultData 处理成最终的结果数据
 func handleProfitResultData(xDataListInit []XData, futureNameMap map[int]map[int]string, yDataList []YData, earliestDateTime time.Time, allEdbInfoIds []int) (xDataList []XData, newYDataList []YData, err error) {
 	newYDataList = yDataList