浏览代码

Merge branch 'hotfix/bug_5322_feture_good_profit' into debug

xyxie 1 周之前
父节点
当前提交
4e1c191f81
共有 1 个文件被更改,包括 75 次插入40 次删除
  1. 75 40
      services/data/future_good/profit_chart_info.go

+ 75 - 40
services/data/future_good/profit_chart_info.go

@@ -71,7 +71,7 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 
 	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
@@ -97,14 +97,19 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 			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][]*data_manage.EdbDataList, 0)
 	// 特殊的商品期货合约(只有M+N的合约,没有固定日期的合约)
 	specialFutureGoodEdbInfoMap := make(map[int]map[int]*future_good.FutureGoodEdbInfo, 0)
@@ -117,7 +122,7 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 		}
 	}
 
-	nMap := make(map[string]string)
+	nAllMap := make(map[string][]string)
 	var maxN int // 最大N值
 	for _, v := range zlFutureGoodEdbInfoList {
 		// 如果不是有效的商品期货指标,那么就过滤掉,不做数据查询处理,避免没必要的请求
@@ -131,53 +136,58 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 			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([]*data_manage.EdbDataList, 0)
-
-			tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
-			if tmpErr != nil {
-				return
-			}
-			for _, tmpData := range tmpDataList {
-				dataList = append(dataList, &data_manage.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, childFutureGoodEdbInfo := range childFutureGoodEdbInfoAllMap {
+			for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfo {
+				nAllMap[findDateTime] = append(nAllMap[findDateTime], date)
+				dataList := make([]*data_manage.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, &data_manage.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)
@@ -189,7 +199,7 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 	}
 	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)
@@ -208,7 +218,7 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 }
 
 // ProfitChartChartData 获取数据
-func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[int][]*data_manage.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*data_manage.EdbDataList, chartInfoDateList []request.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 []data_manage.YData, futureGoodNameMap map[int]map[int]string, err error) {
+func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[int][]*data_manage.EdbDataList, futureGoodEdbInfoAllMap map[int]map[string]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*data_manage.EdbDataList, chartInfoDateList []request.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 []data_manage.YData, futureGoodNameMap map[int]map[int]string, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
 	//earliestDateTime time.Time
 	// ETA指标数据
@@ -287,6 +297,7 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 		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 {
@@ -318,6 +329,7 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 		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 {
@@ -333,17 +345,20 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 			// 用实际日期的月份作为基准,往前推12个月(2024-5-13 16:26:43修改)
 			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 {
@@ -366,10 +381,14 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 
 			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)
 				}
 			}
 			// 合约的数据不全,不参与计算
@@ -381,8 +400,8 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 
 			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], ")")
@@ -574,6 +593,22 @@ 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 []data_manage.XData, futureNameMap map[int]map[int]string, yDataList []data_manage.YData, earliestDateTime time.Time, allEdbInfoIds []int) (xDataList []data_manage.XData, newYDataList []data_manage.YData, err error) {
 	newYDataList = yDataList