Pārlūkot izejas kodu

fix:stl指标增加时间戳

zqbao 6 mēneši atpakaļ
vecāks
revīzija
672f96772b

+ 40 - 0
controllers/data_manage/stl/stl.go

@@ -100,6 +100,46 @@ func (c *STLController) SaveConf() {
 	br.Success = true
 }
 
+// ConfigDetail
+// @Title STL分解配置保存
+// @Description STL分解配置保存
+// @Success 200 {object} request.STLReq
+// @router /config/detail [get]
+func (c *STLController) ConfigDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	configId, err := c.GetInt("CalculateStlConfigId")
+	if err != nil {
+		br.Msg = "请求参数错误"
+		br.ErrMsg = err.Error()
+		return
+	}
+	resp, msg, err := stl.GetStlConfig(configId)
+	if err != nil {
+		if msg == "" {
+			msg = "获取异常"
+		}
+		br.Msg = msg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 // SaveStlEdbInfo
 // @Title STL分解指标保存到指标库
 // @Description STL分解指标保存到指标库

+ 21 - 2
models/data_manage/stl/response/stl.go

@@ -25,10 +25,29 @@ type EvaluationResult struct {
 }
 
 type EdbData struct {
-	Value    string
-	DataTime string
+	Value         string
+	DataTime      string
+	DataTimestamp int64
 }
 
 type SaveStlConfigResp struct {
 	CalculateStlConfigId int64 `description:"配置文件id"`
 }
+
+type StlConfigResp struct {
+	EdbInfoId            int     `description:"指标ID"`
+	EdbInfoName          string  `description:"指标名称"`
+	CalculateStlConfigId int     `description:"计算的STL配置ID"`
+	DataRangeType        int     `description:"数据时间类型:1-全部时间,2-最近N年,3-区间设置,4-区间设置(至今)"`
+	StartDate            string  `description:"开始日期"`
+	EndDate              string  `description:"结束日期"`
+	LastNYear            int     `description:"最近N年"`
+	Period               int     `description:"数据的周期,根据频率设置"`
+	Seasonal             int     `description:"季节性成分窗口大小,一般为period+1,可以设置为大于period的正奇数"`
+	Trend                int     `description:"趋势成分窗口大小,一般为period+1,可以设置为大于period的正奇数"`
+	Fraction             float64 `description:"趋势项的平滑系数,默认为0.2,区间为[0-1]"`
+	Robust               bool    `description:"是否使用稳健方法: true(使用) false(不使用)  "`
+	TrendDeg             int     `description:"分解中趋势多项式次数,默认为1,不超过5的正整数"`
+	SeasonalDeg          int     `description:"分解中季节性多项次数,默认为1,不超过5的正整数"`
+	LowPassDeg           int     `description:"分解中低通滤波器次数,默认为1,不超过5的正整数"`
+}

+ 66 - 11
services/data/stl/stl.go

@@ -191,9 +191,11 @@ func GenerateStlEdbData(req *request.StlConfigReq, adminId int) (resp *response.
 func formatEdbData(items []*data_manage.EdbData) []*response.EdbData {
 	res := make([]*response.EdbData, 0, len(items))
 	for _, item := range items {
+		t, _ := time.Parse(utils.FormatDate, item.DataTime)
 		res = append(res, &response.EdbData{
-			DataTime: item.DataTime,
-			Value:    strconv.FormatFloat(item.Value, 'f', -1, 64),
+			DataTime:      item.DataTime,
+			Value:         strconv.FormatFloat(item.Value, 'f', -1, 64),
+			DataTimestamp: t.UnixMilli(),
 		})
 	}
 	return res
@@ -219,17 +221,20 @@ func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart r
 					continue
 				}
 				var date string
+				var dataTimestamp int64
 				if row.Cells[0].Type() == xlsx.CellTypeNumeric {
 					dataNum, _ := strconv.ParseFloat(row.Cells[0].Value, 64)
 					tmpTime := xlsx.TimeFromExcelTime(dataNum, false)
 					date = tmpTime.Format(utils.FormatDate)
+					dataTimestamp = tmpTime.UnixMilli()
 				} else {
-					date = row.Cells[0].String()
-					date = strings.Split(date, " ")[0]
+					timeDate, _ := time.Parse(utils.FormatDateTime, date)
+					date = timeDate.Format(utils.FormatDate)
+					dataTimestamp = timeDate.UnixMilli()
 				}
 				fv, _ := row.Cells[1].Float()
 				value := strconv.FormatFloat(fv, 'f', 4, 64)
-				SeasonalChart.DataList = append(SeasonalChart.DataList, &response.EdbData{DataTime: date, Value: value})
+				SeasonalChart.DataList = append(SeasonalChart.DataList, &response.EdbData{DataTime: date, Value: value, DataTimestamp: dataTimestamp})
 			}
 		case "趋势":
 			for i, row := range sheet.Rows {
@@ -237,17 +242,20 @@ func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart r
 					continue
 				}
 				var date string
+				var dataTimestamp int64
 				if row.Cells[0].Type() == xlsx.CellTypeNumeric {
 					dataNum, _ := strconv.ParseFloat(row.Cells[0].Value, 64)
 					tmpTime := xlsx.TimeFromExcelTime(dataNum, false)
 					date = tmpTime.Format(utils.FormatDate)
+					dataTimestamp = tmpTime.UnixMilli()
 				} else {
-					date = row.Cells[0].String()
-					date = strings.Split(date, " ")[0]
+					timeDate, _ := time.Parse(utils.FormatDateTime, date)
+					date = timeDate.Format(utils.FormatDate)
+					dataTimestamp = timeDate.UnixMilli()
 				}
 				fv, _ := row.Cells[1].Float()
 				value := strconv.FormatFloat(fv, 'f', 4, 64)
-				TrendChart.DataList = append(TrendChart.DataList, &response.EdbData{DataTime: date, Value: value})
+				TrendChart.DataList = append(TrendChart.DataList, &response.EdbData{DataTime: date, Value: value, DataTimestamp: dataTimestamp})
 			}
 		case "残差":
 			for i, row := range sheet.Rows {
@@ -255,17 +263,20 @@ func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart r
 					continue
 				}
 				var date string
+				var dataTimestamp int64
 				if row.Cells[0].Type() == xlsx.CellTypeNumeric {
 					dataNum, _ := strconv.ParseFloat(row.Cells[0].Value, 64)
 					tmpTime := xlsx.TimeFromExcelTime(dataNum, false)
 					date = tmpTime.Format(utils.FormatDate)
+					dataTimestamp = tmpTime.UnixMilli()
 				} else {
-					date = row.Cells[0].String()
-					date = strings.Split(date, " ")[0]
+					timeDate, _ := time.Parse(utils.FormatDateTime, date)
+					date = timeDate.Format(utils.FormatDate)
+					dataTimestamp = timeDate.UnixMilli()
 				}
 				fv, _ := row.Cells[1].Float()
 				value := strconv.FormatFloat(fv, 'f', 4, 64)
-				ResidualChart.DataList = append(ResidualChart.DataList, &response.EdbData{DataTime: date, Value: value})
+				ResidualChart.DataList = append(ResidualChart.DataList, &response.EdbData{DataTime: date, Value: value, DataTimestamp: dataTimestamp})
 			}
 		}
 	}
@@ -881,6 +892,50 @@ func SaveStlEdbInfo(req *request.SaveStlEdbInfoReq, adminId int, adminRealName,
 	return
 }
 
+func GetStlConfig(configId int) (resp *response.StlConfigResp, msg string, err error) {
+	conf, err := stl.GetCalculateStlConfigById(configId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			msg = "未找到配置,请刷新后重试"
+			return
+		}
+		msg = "获取失败"
+		return
+	}
+	var req request.StlConfigReq
+	if err = json.Unmarshal([]byte(conf.Config), &req); err != nil {
+		msg = "获取失败"
+		return
+	}
+	edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			msg = "未找到指标,请刷新后重试"
+			return
+		}
+		msg = "获取失败"
+		return
+	}
+	resp = &response.StlConfigResp{
+		CalculateStlConfigId: conf.CalculateStlConfigId,
+		EdbInfoId:            req.EdbInfoId,
+		EdbInfoName:          edbInfo.EdbName,
+		DataRangeType:        req.DataRangeType,
+		StartDate:            req.StartDate,
+		EndDate:              req.EndDate,
+		LastNYear:            req.LastNYear,
+		Period:               req.Period,
+		Seasonal:             req.Seasonal,
+		Trend:                req.Trend,
+		Fraction:             req.Fraction,
+		Robust:               req.Robust,
+		TrendDeg:             req.TrendDeg,
+		SeasonalDeg:          req.SeasonalDeg,
+		LowPassDeg:           req.LowPassDeg,
+	}
+	return
+}
+
 func CheckDulplicateEdbInfoName(edbName, lang string) (ok bool, err error) {
 	var count int
 	var condition string