Przeglądaj źródła

add:stl配置保存

zqbao 4 miesięcy temu
rodzic
commit
1b4639930d

+ 62 - 2
controllers/data_manage/stl/stl.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/utils"
 
 	"eta/eta_api/models/data_manage/stl/request"
+	"eta/eta_api/models/data_manage/stl/response"
 )
 
 type STLController struct {
@@ -17,7 +18,7 @@ type STLController struct {
 // Preview
 // @Title STL分解预览
 // @Description STL分解预览
-// @Success 200 {object} data_manage.BaiinfoClassify
+// @Success 200 {object} request.STLReq
 // @router /chart_info/preview [post]
 func (c *STLController) Preview() {
 	br := new(models.BaseResponse).Init()
@@ -32,7 +33,7 @@ func (c *STLController) Preview() {
 		br.Ret = 408
 		return
 	}
-	var req *request.STLReq
+	var req *request.StlConfigReq
 	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
 		br.Msg = "请求参数错误"
 		br.ErrMsg = err.Error()
@@ -56,6 +57,65 @@ func (c *STLController) Preview() {
 	return
 }
 
+// SaveConf
+// @Title STL分解配置保存
+// @Description STL分解配置保存
+// @Success 200 {object} request.STLReq
+// @router /config/save [post]
+func (c *STLController) SaveConf() {
+	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
+	}
+	var req *request.StlConfigReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "请求参数错误"
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	insertId, err := stl.SaveStlConfig(req, sysUser.AdminId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,err:" + err.Error()
+		return
+	}
+	resp := new(response.SaveStlConfigResp)
+	resp.CalculateStlConfigId = insertId
+
+	br.Data = resp
+	br.Msg = "保存成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// SaveStlEdbInfo
+// @Title STL分解指标保存到指标库
+// @Description STL分解指标保存到指标库
+// @Success 200 {object} request.STLReq
+// @router /edb_info/save [post]
+func (c *STLController) SaveStlEdbInfo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	var req *request.SaveStlEdbInfoReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "请求参数错误"
+		br.ErrMsg = err.Error()
+		return
+	}
+}
+
 // EdbInfoFilterByEs
 // @Title 指标筛选接口
 // @Description 指标筛选接口

+ 21 - 0
models/data_manage/stl/calculate_stl_config.go

@@ -0,0 +1,21 @@
+package stl
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CalculateStlConfig struct {
+	CalculateStlConfigId int       `orm:"column(calculate_stl_config_id);pk"`
+	Config               string    `description:"STL计算配置"`
+	SysUserId            int       `description:"系统用户ID"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"更新时间"`
+}
+
+func (c *CalculateStlConfig) Insert() (insertId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	insertId, err = o.Insert(c)
+	return
+}

+ 21 - 0
models/data_manage/stl/calculate_stl_config_mapping.go

@@ -0,0 +1,21 @@
+package stl
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CalculateStlConfigMapping struct {
+	Id                   int       `description:"主键"`
+	CalculateStlConfigId int       `description:"stl配置id"`
+	EdbInfoId            int       `description:"edb信息id"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"修改时间"`
+}
+
+func (c *CalculateStlConfigMapping) Insert() (insertId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	insertId, err = o.Insert(c)
+	return
+}

+ 24 - 14
models/data_manage/stl/request/stl.go

@@ -1,17 +1,27 @@
 package request
 
-type STLReq struct {
-	EdbInfoId     int     `description:"指标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的正整数"`
+type StlConfigReq struct {
+	EdbInfoId            int     `description:"指标ID"`
+	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的正整数"`
+}
+
+type SaveStlEdbInfoReq struct {
+	CalculateStlConfigId int    `description:"计算的STL配置ID"`
+	EdbInfoId            int    `description:"指标ID"`
+	Frequency            string `description:"频度"`
+	Uint                 string `description:"单位"`
+	EdbName              string `description:"指标名称"`
+	ClassifyId           int    `description:"分类ID"`
 }

+ 4 - 0
models/data_manage/stl/response/stl.go

@@ -28,3 +28,7 @@ type EdbData struct {
 	Value    string
 	DataTime string
 }
+
+type SaveStlConfigResp struct {
+	CalculateStlConfigId int64 `description:"配置文件id"`
+}

+ 21 - 3
services/data/stl/stl.go

@@ -3,6 +3,7 @@ package stl
 import (
 	"encoding/json"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/stl"
 	"eta/eta_api/models/data_manage/stl/request"
 	"eta/eta_api/models/data_manage/stl/response"
 	"eta/eta_api/services/data/data_manage_permission"
@@ -27,7 +28,11 @@ const (
 	RANGE_DATE_TO_NOW
 )
 
-func GenerateStlEdbData(req *request.STLReq, adminId int) (resp *response.StlPreviewResp, msg string, err error) {
+var EDB_DATA_CALCULATE_STL_TREND_CACHE = `eta:stl_decompose:trend:config_id:`
+var EDB_DATA_CALCULATE_STL_SEASONAL_CACHE = `eta:stl_decompose:seasonal:config_id:`
+var EDB_DATA_CALCULATE_STL_RESIDUAL_CACHE = `eta:stl_decompose:residual:config_id:`
+
+func GenerateStlEdbData(req *request.StlConfigReq, adminId int) (resp *response.StlPreviewResp, msg string, err error) {
 	edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
@@ -124,12 +129,10 @@ func GenerateStlEdbData(req *request.STLReq, adminId int) (resp *response.StlPre
 	defer os.Remove(loadFilePath)
 
 	saveFilePath := exPath + "/" + strconv.Itoa(adminId) + "_" + time.Now().Format(utils.FormatDateTimeUnSpace) + "_res" + ".xlsx"
-	t1 := time.Now()
 	result, err := execStlPythonCode(loadFilePath, saveFilePath, req.Period, req.Seasonal, req.Trend, req.TrendDeg, req.SeasonalDeg, req.LowPassDeg, req.Fraction, req.Robust)
 	if err != nil {
 		msg = "计算失败,请重新选择指标和参数后计算"
 	}
-	fmt.Println("stl计算耗时:", time.Since(t1))
 	trendChart, seasonalChart, residualChart, err := ParseStlExcel(saveFilePath)
 	if err != nil {
 		msg = "解析Excel失败"
@@ -158,6 +161,10 @@ func GenerateStlEdbData(req *request.STLReq, adminId int) (resp *response.StlPre
 	resp.EvaluationResult.AdfPValue = strconv.FormatFloat(result.AdfPValue, 'f', -1, 64)
 	resp.EvaluationResult.LjungBoxPValue = strconv.FormatFloat(result.LbTestPValue, 'f', -1, 64)
 
+	utils.Rc.Put(EDB_DATA_CALCULATE_STL_TREND_CACHE+strconv.Itoa(req.CalculateStlConfigId)+":"+resp.TrendChartInfo.Title, trendChart, time.Hour)
+	utils.Rc.Put(EDB_DATA_CALCULATE_STL_TREND_CACHE+strconv.Itoa(req.CalculateStlConfigId)+":"+resp.SeasonalChartInfo.Title, seasonalChart, time.Hour)
+	utils.Rc.Put(EDB_DATA_CALCULATE_STL_TREND_CACHE+strconv.Itoa(req.CalculateStlConfigId)+":"+resp.ResidualChartInfo.Title, residualChart, time.Hour)
+
 	return
 }
 
@@ -354,6 +361,17 @@ print(output)
 	return
 }
 
+func SaveStlConfig(req *request.StlConfigReq, adminId int) (insertId int64, err error) {
+	conf := new(stl.CalculateStlConfig)
+	b, _ := json.Marshal(req)
+	conf.Config = string(b)
+	conf.SysUserId = adminId
+	conf.CreateTime = time.Now()
+	conf.ModifyTime = time.Now()
+	insertId, err = conf.Insert()
+	return
+}
+
 func SearchEdbInfoWithStl(adminId int, keyWord string, currentIndex, pageSize int) (resp data_manage.EdbInfoFilterDataResp, msg string, err error) {
 	var edbInfoList []*data_manage.EdbInfoList