瀏覽代碼

fix:优化数据返回结构

Roc 1 年之前
父節點
當前提交
7899cd4cb5

+ 2 - 2
controllers/chart_common.go

@@ -396,7 +396,7 @@ func GetLineFeatureChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, ke
 			errMsg = "格式化配置项失败,Err:" + tmpErr.Error()
 			return
 		}
-		edbList, err, msg = lineFeatureServ.GetStandardDeviationData(0, edbMapping, calculateValue)
+		edbList, resultResp, err, msg = lineFeatureServ.GetStandardDeviationData(0, edbMapping, calculateValue)
 	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
 		var percentileConfig line_featureReq.Percentile
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &percentileConfig)
@@ -405,7 +405,7 @@ func GetLineFeatureChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, ke
 			errMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		edbList, err, msg = lineFeatureServ.GetPercentileData(0, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
+		edbList, resultResp, err, msg = lineFeatureServ.GetPercentileData(0, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
 	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
 		var frequencyDistributionConfig line_featureReq.FrequencyDistribution
 		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &frequencyDistributionConfig)

+ 21 - 0
models/data_manage/line_feature/response/line_feature.go

@@ -1,5 +1,26 @@
 package response
 
+import "hongze/hongze_chart_lib/models"
+
+// LineFeatureDataResp 曲线图的一些数据返回
+type LineFeatureDataResp struct {
+	MaxData             float64
+	MinData             float64
+	LatestDate          string `description:"真实数据的最后日期"`
+	EdbInfoCategoryType int
+	ChartColor          string
+	ChartStyle          string
+	PredictChartColor   string
+	ChartType           int
+	ChartWidth          float64
+	EdbName             string
+	EdbNameEn           string
+	Unit                string
+	UnitEn              string
+	IsAxis              int
+	DataList            []models.EdbDataList
+}
+
 // FrequencyDistributionResp 频率分布图数据
 type FrequencyDistributionResp struct {
 	LeftMinValue  float64

+ 117 - 61
services/data/line_feature/chart_info.go

@@ -11,7 +11,7 @@ import (
 )
 
 // GetStandardDeviationData 获取标准差图表的指标数据
-func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int) (edbList []*models.ChartEdbInfoMapping, err error, errMsg string) {
+func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int) (edbList []*models.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
 	edbList = make([]*models.ChartEdbInfoMapping, 0)
 
 	// 指标对应的所有数据
@@ -20,37 +20,65 @@ func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoM
 		return
 	}
 
-	for k, edb := range edbList {
-		dataList := edb.DataList.([]*models.EdbDataList)
-		newDataList := make([]models.EdbDataList, 0)
-		lenData := len(dataList)
-		if lenData >= calculateValue {
-			tmpDataList := make([]float64, 0)
-			for _, tmpData := range dataList {
-				tmpDataList = append(tmpDataList, tmpData.Value)
+	if len(edbList) != 1 {
+		errMsg = `指标异常`
+		err = errors.New(errMsg)
+		return
+	}
+
+	edb := edbList[0]
+	dataList := edb.DataList.([]*models.EdbDataList)
+	newDataList := make([]models.EdbDataList, 0)
+	lenData := len(dataList)
+
+	var minVal, maxVal float64
+	if lenData >= calculateValue {
+		tmpDataList := make([]float64, 0)
+		for _, tmpData := range dataList {
+			tmpDataList = append(tmpDataList, tmpData.Value)
+		}
+		for i := calculateValue; i <= lenData; i++ {
+			tmpV := utils.CalculateStandardDeviation(tmpDataList[i-calculateValue : i])
+			tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
+			newDataList = append(newDataList, models.EdbDataList{
+				EdbDataId:     i,
+				EdbInfoId:     edb.EdbInfoId,
+				DataTime:      dataList[i-1].DataTime,
+				DataTimestamp: dataList[i-1].DataTimestamp,
+				Value:         tmpV,
+			})
+			if tmpV > maxVal {
+				maxVal = tmpV
 			}
-			for i := calculateValue; i <= lenData; i++ {
-				tmpV := utils.CalculateStandardDeviation(tmpDataList[i-calculateValue : i])
-				tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
-				newDataList = append(newDataList, models.EdbDataList{
-					EdbDataId:     i,
-					EdbInfoId:     edb.EdbInfoId,
-					DataTime:      dataList[i-1].DataTime,
-					DataTimestamp: dataList[i-1].DataTimestamp,
-					Value:         tmpV,
-				})
+			if tmpV < minVal {
+				minVal = tmpV
 			}
 		}
+	}
 
-		edb.DataList = newDataList
-		edbList[k] = edb
+	dataResp = response.LineFeatureDataResp{
+		MaxData:             maxVal,
+		MinData:             minVal,
+		LatestDate:          edb.LatestDate,
+		EdbInfoCategoryType: edb.EdbInfoCategoryType,
+		ChartColor:          `#00F`,
+		ChartStyle:          `spline`,
+		PredictChartColor:   `#00F`,
+		ChartType:           0,
+		ChartWidth:          3,
+		EdbName:             "标准差",
+		EdbNameEn:           "standard deviation",
+		Unit:                edb.Unit,
+		UnitEn:              edb.UnitEn,
+		IsAxis:              1,
+		DataList:            newDataList,
 	}
 
 	return
 }
 
 // GetPercentileData 获取百分位图表的指标数据
-func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*models.ChartEdbInfoMapping, err error, errMsg string) {
+func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*models.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
 	edbList = make([]*models.ChartEdbInfoMapping, 0)
 	moveUnitDays, ok := utils.FrequencyDaysMap[calculateUnit]
 	if !ok {
@@ -64,51 +92,79 @@ func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping,
 	if err != nil {
 		return
 	}
-	for k, edb := range edbList {
-		dataList := edb.DataList.([]*models.EdbDataList)
-		newDataList := make([]models.EdbDataList, 0)
 
-		dataMap := make(map[time.Time]float64, 0)
-		for _, tmpData := range dataList {
-			currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
-			dataMap[currDateTime] = tmpData.Value
-		}
+	if len(edbList) != 1 {
+		errMsg = `指标异常`
+		err = errors.New(errMsg)
+		return
+	}
 
-		//百分位:对所选指标滚动地取对应时间长度的数据值,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不予计算。
-		for i, tmpData := range dataList {
-			currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
-			maxVal := tmpData.Value
-			minVal := tmpData.Value
-			for i := 0; i < calculateDay; i++ {
-				preVal, ok := dataMap[currDateTime.AddDate(0, 0, -i)]
-				if ok {
-					if preVal > maxVal {
-						maxVal = preVal
-					}
-					if preVal < minVal {
-						minVal = preVal
-					}
+	edb := edbList[0]
+	dataList := edb.DataList.([]*models.EdbDataList)
+	newDataList := make([]models.EdbDataList, 0)
+
+	var edbMinVal, edbMaxVal float64
+	dataMap := make(map[time.Time]float64, 0)
+	for _, tmpData := range dataList {
+		currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
+		dataMap[currDateTime] = tmpData.Value
+	}
+
+	//百分位:对所选指标滚动地取对应时间长度的数据值,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不予计算。
+	for i, tmpData := range dataList {
+		currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
+		maxVal := tmpData.Value
+		minVal := tmpData.Value
+		for i := 0; i < calculateDay; i++ {
+			preVal, ok := dataMap[currDateTime.AddDate(0, 0, -i)]
+			if ok {
+				if preVal > maxVal {
+					maxVal = preVal
+				}
+				if preVal < minVal {
+					minVal = preVal
 				}
 			}
+		}
 
-			if maxVal == minVal {
-				continue
-			}
-			tmpV := (tmpData.Value) / (maxVal - minVal) * 100
-			tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
-			//百分位=(现值-Min)/(Max-Min)
-			newDataList = append(newDataList, models.EdbDataList{
-				EdbDataId:     i,
-				EdbInfoId:     edb.EdbInfoId,
-				DataTime:      dataList[i-1].DataTime,
-				DataTimestamp: dataList[i-1].DataTimestamp,
-				Value:         tmpV,
-			})
+		if maxVal == minVal {
+			continue
 		}
-		edb.Unit = "%"
-		edb.UnitEn = "%"
-		edb.DataList = newDataList
-		edbList[k] = edb
+		tmpV := (tmpData.Value) / (maxVal - minVal) * 100
+		tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
+		//百分位=(现值-Min)/(Max-Min)
+		newDataList = append(newDataList, models.EdbDataList{
+			EdbDataId:     i,
+			EdbInfoId:     edb.EdbInfoId,
+			DataTime:      dataList[i-1].DataTime,
+			DataTimestamp: dataList[i-1].DataTimestamp,
+			Value:         tmpV,
+		})
+
+		if tmpV < edbMinVal {
+			edbMinVal = tmpV
+		}
+		if tmpV > edbMaxVal {
+			edbMaxVal = tmpV
+		}
+	}
+
+	dataResp = response.LineFeatureDataResp{
+		MaxData:             edbMaxVal,
+		MinData:             edbMinVal,
+		LatestDate:          edb.LatestDate,
+		EdbInfoCategoryType: edb.EdbInfoCategoryType,
+		ChartColor:          `#00F`,
+		ChartStyle:          `spline`,
+		PredictChartColor:   `#00F`,
+		ChartType:           0,
+		ChartWidth:          3,
+		EdbName:             "百分位",
+		EdbNameEn:           "percentile",
+		Unit:                "%",
+		UnitEn:              "%",
+		IsAxis:              1,
+		DataList:            newDataList,
 	}
 
 	return