Parcourir la source

Merge branch 'pool/337'

Roc il y a 3 semaines
Parent
commit
f95b088512
2 fichiers modifiés avec 82 ajouts et 7 suppressions
  1. 74 7
      services/edb_data_calculate_stl.go
  2. 8 0
      utils/constants.go

+ 74 - 7
services/edb_data_calculate_stl.go

@@ -1,10 +1,12 @@
 package services
 
 import (
+	"database/sql"
 	"encoding/json"
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"github.com/shopspring/decimal"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -166,7 +168,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 		return
 	}
 
-	trendChart, seasonalChart, residualChart, err := ParseStlExcel(saveFilePath)
+	trendChart, seasonalChart, residualChart, nonTrendChartInfo, err := ParseStlExcel(saveFilePath)
 	if err != nil {
 		msg = "解析Excel失败"
 		return
@@ -177,7 +179,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 		msg = "获取指标信息失败"
 		return
 	}
-	err = SyncUpdateRelationEdbInfo(edbInfo, stlConfig, trendChart, seasonalChart, residualChart)
+	err = SyncUpdateRelationEdbInfo(edbInfo, stlConfig, trendChart, seasonalChart, residualChart, nonTrendChartInfo)
 	if err != nil {
 		msg = "更新关联指标失败"
 		return
@@ -186,7 +188,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 	return
 }
 
-func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, trendData, seasonalData, residualData ChartEdbInfo) (err error) {
+func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, trendData, seasonalData, residualData, nonTrendChartInfo ChartEdbInfo) (err error) {
 	configId, err := models.GetCalculateStlConfigMappingIdByEdbInfoId(edbInfo.EdbInfoId)
 	if err != nil {
 		return
@@ -201,15 +203,18 @@ func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, tre
 			continue
 		}
 		switch v.StlEdbType {
-		case 1:
+		case utils.StlTypeTrend:
 			// 趋势指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, trendData)
-		case 2:
+		case utils.StlTypeSeasonal:
 			// 季节性指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, seasonalData)
-		case 3:
+		case utils.StlTypeResidual:
 			// 残差指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, residualData)
+		case utils.StlTypeNonTrend:
+			// 季节+残差指标
+			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, nonTrendChartInfo)
 		default:
 			utils.FileLog.Info("未知的stlEdbType类型, mapping:%v", v)
 			continue
@@ -298,7 +303,7 @@ func SaveToExcel(data []*models.EdbInfoSearchData, filePath string) (err error)
 	return
 }
 
-func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart ChartEdbInfo, err error) {
+func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart, nonTrendChartInfo ChartEdbInfo, err error) {
 	file, err := xlsx.OpenFile(excelPath)
 	if err != nil {
 		return
@@ -394,6 +399,68 @@ func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart C
 			ResidualChart.MinData = MinData
 		}
 	}
+
+	// 数据处理
+	dateList := make([]string, 0)
+	residualDateMap := make(map[string]*EdbData)
+	for _, item := range ResidualChart.DataList {
+		if _, ok := residualDateMap[item.DataTime]; ok {
+			continue
+		}
+		residualDateMap[item.DataTime] = item
+		dateList = append(dateList, item.DataTime)
+	}
+	seasonalDateMap := make(map[string]*EdbData)
+	for _, item := range SeasonalChart.DataList {
+		if _, ok := seasonalDateMap[item.DataTime]; ok {
+			continue
+		}
+		seasonalDateMap[item.DataTime] = item
+	}
+
+	// 季节性项+残差项
+	{
+		dataList := make([]*EdbData, 0)
+		var minValue, maxValue sql.NullFloat64
+		for _, date := range dateList {
+			tmpResidual, ok := residualDateMap[date]
+			if !ok {
+				continue
+			}
+			tmpSeasonal, ok := seasonalDateMap[date]
+			if !ok {
+				continue
+			}
+
+			tmpValue := tmpResidual.Value + tmpSeasonal.Value
+			tmpValue, _ = decimal.NewFromFloat(tmpValue).Round(4).Float64()
+
+			dataList = append(dataList, &EdbData{
+				DataTime:      date,
+				DataTimestamp: 0,
+				Value:         tmpValue,
+			})
+			// 如果没有设置最小值,或者设置的最小值比当前值还大,则需要更新最小值
+			if !minValue.Valid || minValue.Float64 > tmpValue {
+				err = minValue.Scan(tmpValue)
+				if err != nil {
+					return
+				}
+			}
+			// 如果没有设置最大值,或者设置的最大值比当前值还小,则需要更新最大值
+			if !maxValue.Valid || maxValue.Float64 < tmpValue {
+				err = maxValue.Scan(tmpValue)
+				if err != nil {
+					return
+				}
+			}
+		}
+
+		nonTrendChartInfo.DataList = dataList
+		nonTrendChartInfo.MinData = minValue.Float64
+		nonTrendChartInfo.MaxData = maxValue.Float64
+	}
+
 	return
 }
 

+ 8 - 0
utils/constants.go

@@ -355,3 +355,11 @@ const (
 	EdbBaseCalculateExponentialSmoothing = 15 // 指数修匀->15
 	EdbBaseCalculateRjz                  = 16 // 日均值->16
 )
+
+// STL模型类型
+const (
+	StlTypeTrend    = 1 // 趋势
+	StlTypeSeasonal = 2 // 季节性指标
+	StlTypeResidual = 3 // 残差性指标
+	StlTypeNonTrend = 4 // 非趋势性指标
+)