|
@@ -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
|
|
|
}
|
|
|
|