Răsfoiți Sursa

feat:新增指标的计算公式

Roc 1 an în urmă
părinte
comite
f98106feec
3 a modificat fișierele cu 166 adăugiri și 20 ștergeri
  1. 81 0
      controllers/base_from_calculate.go
  2. 76 20
      models/base_calculate.go
  3. 9 0
      routers/commentsRouter.go

+ 81 - 0
controllers/base_from_calculate.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"errors"
 	"eta/eta_index_lib/logic"
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/services"
@@ -2057,3 +2058,83 @@ func (this *CalculateController) ResetCustomAnalysisData() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// Calculate
+// @Title 基础数据计算
+// @Description 拟合残差计算相关性接口
+// @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
+// @Success Ret=200 返回指标id
+// @router /base [post]
+func (this *CalculateController) Calculate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var baseCalculate models.BaseCalculate
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &baseCalculate)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	dateDataMap := make(map[string]float64)
+	var errMsg string
+
+	//1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值
+	switch baseCalculate.Source {
+	case 1:
+		dateDataMap, err, errMsg = baseCalculate.Ljzzy()
+	case 2:
+		dateDataMap, err, errMsg = baseCalculate.Ljzzj()
+	case 3:
+		dateDataMap, err, errMsg = baseCalculate.Tbz()
+	case 4:
+		dateDataMap, err, errMsg = baseCalculate.Tcz()
+	case 5:
+		dateDataMap, err, errMsg = baseCalculate.Nszydpjjs()
+	case 6:
+		dateDataMap, err, errMsg = baseCalculate.Hbz()
+	case 7:
+		dateDataMap, err, errMsg = baseCalculate.Hcz()
+	case 8:
+		dateDataMap, err, errMsg = baseCalculate.UpFrequency()
+	case 9:
+		dateDataMap, err, errMsg = baseCalculate.DownFrequency()
+	case 10:
+		dateDataMap, err, errMsg = baseCalculate.TimeShift()
+	case 11:
+		dateDataMap, err, errMsg = baseCalculate.Cjjx()
+	case 12:
+		dateDataMap, err, errMsg = baseCalculate.Annualized()
+	case 13:
+		dateDataMap, err, errMsg = baseCalculate.Ljz()
+	case 14:
+		dateDataMap, err, errMsg = baseCalculate.LjzNczj()
+	case 15:
+		dateDataMap, err, errMsg = baseCalculate.ExponentialSmoothing()
+	case 16:
+		dateDataMap, err, errMsg = baseCalculate.Rjz()
+	default:
+		errMsg = "错误的计算类型"
+		err = errors.New(errMsg + ":" + strconv.Itoa(baseCalculate.Source))
+	}
+
+	if err != nil {
+		br.Msg = "计算失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = err.Error()
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "计算成功"
+	br.Data = models.BaseCalculateResp{
+		DataMap: dateDataMap,
+	}
+	br.IsAddLog = true
+}

+ 76 - 20
models/base_calculate.go

@@ -10,6 +10,8 @@ import (
 	"time"
 )
 
+// BaseCalculate
+// @Description: 基础的计算公式
 type BaseCalculate struct {
 	DataList      []*EdbInfoSearchData
 	Frequency     string `description:"需要转换的频度"`
@@ -18,6 +20,12 @@ type BaseCalculate struct {
 	MoveType      int    `description:"移动方式:1:领先(默认),2:滞后"`
 	MoveFrequency string `description:"移动频度"`
 	FromFrequency string `description:"来源的频度"`
+	Source        int    `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
+}
+
+type BaseCalculateResp struct {
+	DataMap  map[string]float64
+	DateList []string
 }
 
 // Ljzzy
@@ -27,8 +35,8 @@ type BaseCalculate struct {
 // @datetime2023-11-02 18:05:19
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error) {
-	dataList := obj.DataList
+func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error, errMsg string) {
+	dataList := obj.DataList // 升序
 	// 数据处理
 	yearMap := make(map[int]map[int]*EdbInfoSearchData)
 	dataLen := len(dataList)
@@ -138,8 +146,8 @@ func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error) {
 // @datetime2023-11-02 18:05:05
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error) {
-	dataList := obj.DataList
+func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error, errMsg string) {
+	dataList := obj.DataList // 升序
 	// 数据处理
 	yearMap := make(map[int]map[int]*EdbInfoSearchData)
 	dataLen := len(dataList)
@@ -249,8 +257,8 @@ func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error) {
 // @datetime2023-11-02 18:04:59
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Tbz() (dateDataMap map[string]float64, err error) {
-	dataList := obj.DataList
+func (obj BaseCalculate) Tbz() (dateDataMap map[string]float64, err error, errMsg string) {
+	dataList := obj.DataList // 降序
 	//数据处理
 	var dateArr []string
 	dataMap := make(map[string]*EdbInfoSearchData)
@@ -361,8 +369,8 @@ func tbzDiv(a, b float64) float64 {
 // @datetime2023-11-02 18:04:51
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Tcz() (dateDataMap map[string]float64, err error) {
-	dataList := obj.DataList
+func (obj BaseCalculate) Tcz() (dateDataMap map[string]float64, err error, errMsg string) {
+	dataList := obj.DataList // 降序
 	// 数据处理
 	var dateArr []string
 	dataMap := make(map[string]*EdbInfoSearchData)
@@ -460,7 +468,7 @@ func tczSub(a, b float64) float64 {
 // @datetime2023-11-02 18:17:38
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error, errMsg string) {
 	fromDataList := obj.DataList
 	formulaInt := obj.Formula.(int)
 
@@ -520,7 +528,7 @@ func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error)
 // @datetime2023-11-02 18:28:24
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Hbz() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Hbz() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	formulaInt := obj.Formula.(int)
 
@@ -589,7 +597,7 @@ func hbzDiv(current, pre float64) (val float64, ok bool) {
 // @datetime2023-11-02 18:33:20
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Hcz() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Hcz() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	formulaInt := obj.Formula.(int)
 
@@ -648,7 +656,7 @@ func hczDiv(current, pre float64) float64 {
 // @datetime2023-11-02 18:43:03
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 
 	// 数据处理
@@ -700,7 +708,7 @@ func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err erro
 // @datetime2023-11-02 18:51:26
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	edbFrequency := obj.Frequency
 	formula := obj.Formula.(string)
@@ -860,7 +868,7 @@ func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err er
 // @datetime2023-11-03 13:19:07
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	formulaInt := obj.Formula.(int)
 	moveType := obj.MoveType
@@ -917,7 +925,7 @@ func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error)
 // @datetime2023-11-03 13:28:23
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Cjjx() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Cjjx() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	formulaInt := obj.Formula.(int)
 	calendar := obj.Calendar
@@ -1045,7 +1053,7 @@ func cjjxSub(currValue float64, pastValue []float64) (value float64, ok bool) {
 // @param edbCode string
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error, errMsg string) {
 	fromDataList := obj.DataList
 	lenFromDataList := len(fromDataList)
 	// 如果来源指标没有数据,那么就直接返回得了
@@ -1141,7 +1149,7 @@ func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error
 // @datetime2023-11-03 13:49:17
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	frequency := obj.Frequency         //需要变更的频度
 	fromFrequency := obj.FromFrequency //来源的频度
@@ -1408,7 +1416,7 @@ func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error) {
 // @datetime2023-11-03 13:55:44
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	frequency := obj.Frequency         //需要变更的频度
 	fromFrequency := obj.FromFrequency //来源的频度
@@ -1521,7 +1529,7 @@ func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error) {
 // @datetime2023-11-03 14:07:47
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) ExponentialSmoothing() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) ExponentialSmoothing() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 	formula := obj.Formula.(string) // alpha值
 
@@ -1606,7 +1614,7 @@ func calculateExponentialSmoothingData(dataList []*EdbInfoSearchData, alpha floa
 // @datetime2023-11-03 14:47:47
 // @return dateDataMap map[string]float64
 // @return err error
-func (obj BaseCalculate) Rjz() (dateDataMap map[string]float64, err error) {
+func (obj BaseCalculate) Rjz() (dateDataMap map[string]float64, err error, errMsg string) {
 	dataList := obj.DataList
 
 	fromFrequency := obj.FromFrequency
@@ -1668,3 +1676,51 @@ func rjzDivV2(a float64, b int) (val float64, ok bool) {
 
 	return
 }
+
+// reverseSlice
+// @Description: 倒装切片
+// @author: Roc
+// @datetime2023-11-06 14:08:25
+// @param slice []*EdbInfoSearchData
+// @return []*EdbInfoSearchData
+func reverseSlice(slice []*EdbInfoSearchData) []*EdbInfoSearchData {
+	reversed := make([]*EdbInfoSearchData, len(slice))
+	for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 {
+		reversed[i] = slice[j]
+	}
+	return reversed
+}
+
+// reverseSlice
+// @Description: 倒装切片
+// @author: Roc
+// @datetime2023-11-06 14:08:25
+// @param slice []*EdbInfoSearchData
+// @return []*EdbInfoSearchData
+func reverseSliceByDesc(slice []*EdbInfoSearchData) (newSlice []*EdbInfoSearchData, err error) {
+	// 只有一个数据的话,那么就直接返回
+	if len(slice) <= 1 {
+		newSlice = slice
+		return
+	}
+
+	startDate, err := time.ParseInLocation(utils.FormatDate, slice[0].DataTime, time.Local)
+	if err != nil {
+		return
+	}
+	secondDate, err := time.ParseInLocation(utils.FormatDate, slice[1].DataTime, time.Local)
+	if err != nil {
+		return
+	}
+	if !secondDate.After(startDate) {
+		newSlice = slice
+		return
+	}
+
+	newSlice = make([]*EdbInfoSearchData, len(slice))
+	for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 {
+		newSlice[i] = slice[j]
+	}
+
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -97,6 +97,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:CalculateController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:CalculateController"],
+        beego.ControllerComments{
+            Method: "Calculate",
+            Router: `/base`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:CalculateController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:CalculateController"],
         beego.ControllerComments{
             Method: "BatchEdit",