فهرست منبع

Merge branch 'bugfix_8200' of eta_server/eta_index_lib into master

chenhan 6 روز پیش
والد
کامیت
00028f7dc1
2فایلهای تغییر یافته به همراه81 افزوده شده و 56 حذف شده
  1. 17 18
      models/calculate_residual_analysis_config_mapping.go
  2. 64 38
      models/edb_data_residual_analysis.go

+ 17 - 18
models/calculate_residual_analysis_config_mapping.go

@@ -18,25 +18,24 @@ type CalculateResidualAnalysisConfigMapping struct {
 
 // GetConfigMappingListByConditionNotBase 查询非基础指标的配置映射
 func GetConfigMappingListByConditionNotBase(edbInfoId int) (configMapping []CalculateResidualAnalysisConfigMapping, err error) {
-	//sql := `
-	//SELECT
-	//	*
-	//FROM
-	//	calculate_residual_analysis_config_mapping
-	//WHERE
-	//	calculate_residual_analysis_config_id IN ( SELECT calculate_residual_analysis_config_id FROM calculate_residual_analysis_config_mapping WHERE edb_info_id = ? )
-	//	// AND index_type != 3
-	//	// AND index_type != 4`
 	sql := `
-	SELECT *
-		FROM calculate_residual_analysis_config_mapping m
-		WHERE EXISTS (
-			SELECT 1
-			FROM calculate_residual_analysis_config_mapping subq
-			WHERE subq.calculate_residual_analysis_config_id = m.calculate_residual_analysis_config_id
-			  AND subq.edb_info_id = ? AND subq.index_type != 3
- 			AND subq.index_type != 4
-		)`
+	SELECT
+		*
+	FROM
+		calculate_residual_analysis_config_mapping
+	WHERE
+		calculate_residual_analysis_config_id IN ( SELECT calculate_residual_analysis_config_id FROM calculate_residual_analysis_config_mapping WHERE edb_info_id = ?  AND index_type != 3
+		 AND index_type != 4)
+		`
+	//sql :=
+	//SELECT *
+	//	FROM calculate_residual_analysis_config_mapping m
+	//	WHERE calculate_residual_analysis_config_id in  (
+	//		SELECT calculate_residual_analysis_config_id
+	//		FROM calculate_residual_analysis_config_mapping subq
+	//		WHERE  subq.edb_info_id = ? AND subq.index_type != 3
+	//		AND subq.index_type != 4
+	//	)`
 
 	err = global.DEFAULT_DB.Raw(sql, edbInfoId).Find(&configMapping).Error
 	if err != nil {

+ 64 - 38
models/edb_data_residual_analysis.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
 	"math"
 	"sort"
@@ -198,46 +199,55 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
 		if err != nil {
 			return err
 		}
+		for _, edbList := range mappingEdbList {
+			if edbList.EdbInfoId == 0 {
+				for _, edbData := range edbList.DataList {
+					value, _ := strconv.ParseFloat(edbData.Value, 64)
+					edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
+						EdbInfoId:     int(mapping.EdbInfoId),
+						EdbCode:       edbInfo.EdbCode,
+						DataTime:      edbData.DataTime,
+						Value:         value,
+						CreateTime:    time.Now(),
+						ModifyTime:    time.Now(),
+						DataTimeStamp: edbData.DataTimestamp,
+					})
+				}
 
-		for _, edbData := range mappingEdbList[0].DataList {
-			value, _ := strconv.ParseFloat(edbData.Value, 64)
-			edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
-				EdbInfoId:     int(mapping.EdbInfoId),
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      edbData.DataTime,
-				Value:         value,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimeStamp: edbData.DataTimestamp,
-			})
+				err = AddResidualAnalysisData(edbDataResidualAnalysisList)
+				if err != nil {
+					return err
+				}
+				break
+			}
 		}
 
-		err = AddResidualAnalysisData(edbDataResidualAnalysisList)
-		if err != nil {
-			return err
-		}
 	} else if mapping.IndexType == 2 {
 		edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
 		if err != nil {
 			return err
 		}
+		for _, edbList := range residualEdbList {
+			if edbList.EdbInfoId == 0 {
+				for _, edbData := range edbList.DataList {
+					value, _ := strconv.ParseFloat(edbData.Value, 64)
+					edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
+						EdbInfoId:     int(mapping.EdbInfoId),
+						EdbCode:       edbInfo.EdbCode,
+						DataTime:      edbData.DataTime,
+						Value:         value,
+						CreateTime:    time.Now(),
+						ModifyTime:    time.Now(),
+						DataTimeStamp: edbData.DataTimestamp,
+					})
+				}
 
-		for _, edbData := range residualEdbList[0].DataList {
-			value, _ := strconv.ParseFloat(edbData.Value, 64)
-			edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
-				EdbInfoId:     int(mapping.EdbInfoId),
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      edbData.DataTime,
-				Value:         value,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimeStamp: edbData.DataTimestamp,
-			})
-		}
-
-		err = AddResidualAnalysisData(edbDataResidualAnalysisList)
-		if err != nil {
-			return err
+				err = AddResidualAnalysisData(edbDataResidualAnalysisList)
+				if err != nil {
+					return err
+				}
+				break
+			}
 		}
 	}
 
@@ -257,9 +267,10 @@ func fillResidualChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoM
 	dataAList := edbInfoA.DataList
 	edbData := make([]*EdbDataList, len(dataAList))
 	for i, data := range dataAList {
-		f, _ := strconv.ParseFloat(data.Value, 64)
+		//f, _ := strconv.ParseFloat(data.Value, 64)
+		f, _ := decimal.NewFromString(data.Value)
 		edbData[i] = &EdbDataList{
-			Value:         f,
+			Value:         f.InexactFloat64(),
 			DataTimestamp: data.DataTimestamp,
 			DataTime:      data.DataTime,
 			EdbInfoId:     data.EdbInfoId,
@@ -380,7 +391,12 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
 	}
 
 	dataList := edbInfoMappingB.DataList
+	sort.Sort(ByDataTime(dataList))
+	for _, indexData := range dataList {
+		fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
+	}
 
+	fmt.Println("========================================================================================================")
 	// 指标B数据补充
 	// 新建一个切片来保存补充的数据
 	var replenishDataList []*EdbData
@@ -414,7 +430,13 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
 
 	// 排序
 	sort.Sort(ByDataTime(dataList))
+	// 排序
+	sort.Sort(ByDataTime(dataList))
+	for _, indexData := range dataList {
+		fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
+	}
 
+	fmt.Println("========================================================================================================")
 	// 拟合残差 计算a,b
 	var coordinateList []utils.Coordinate
 	var replenishADataList []*EdbDataList
@@ -514,7 +536,9 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
 
 	// 填充映射指标值 使得时间长度一致
 	dataList = FillDataBList(dataList, edbInfoMappingA)
-
+	for _, indexData := range dataList {
+		fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
+	}
 	// 根据指标A的时间key,在B的映射指标中筛选出对应的值
 	var dataBList []*EdbDataList
 
@@ -528,9 +552,10 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
 				indexDataCopy := *indexData
 
 				// 计算指标B映射值
-				f, _ := strconv.ParseFloat(indexData.Value, 64)
-				indexDataCopy.Value = fmt.Sprintf("%f", math.Round((a*f+b)*10000)/10000)
-
+				//f, _ := strconv.ParseFloat(indexData.Value, 64)
+				f, _ := decimal.NewFromString(indexData.Value)
+				indexDataCopy.Value = fmt.Sprintf("%f", math.Round((a*f.InexactFloat64()+b)*10000)/10000)
+				//fmt.Printf("%s--%s%s\n", indexData.Value, indexDataCopy.Value, indexData.DataTime)
 				// 比较最大值
 				if indexData.Value > indexMax {
 					indexMax = indexData.Value
@@ -581,6 +606,7 @@ func FillDataBList(dataList []*EdbData, edbInfoMappingA *EdbInfoList) []*EdbData
 	dataAList := edbInfoMappingA.DataList
 
 	if len(dataList) > 0 && len(dataAList) > 0 {
+		fmt.Println("len(dataList):", len(dataList), "len(dataAList):", len(dataAList))
 		for utils.StringToTime(dataList[len(dataList)-1].DataTime).Before(utils.StringToTime(dataAList[len(dataAList)-1].DataTime)) {
 			// 使用A的时间填充时间差
 			timeDiff := utils.GetNextDayN(dataList[len(dataList)-1].DataTime, 1)
@@ -626,7 +652,7 @@ func fillOriginalChart(config ResidualAnalysisConfig, req *EdbInfo, mappingList
 					return nil, nil, nil, fmt.Errorf("领先值不能小于0")
 				} else if config.LeadValue > 0 {
 					edbInfoMapping.EdbName = v.EdbName + "(领先" + strconv.Itoa(config.LeadValue) + config.LeadFrequency + ")"
-					for _, indexData := range dataList {
+					for _, indexData := range data {
 						switch config.LeadFrequency {
 						case "天":
 							indexData.DataTime = utils.GetNextDayN(indexData.DataTime, config.LeadValue)