hsun 10 hónapja
szülő
commit
6bb131d423
2 módosított fájl, 139 hozzáadás és 0 törlés
  1. 109 0
      controllers/base_from_calculate.go
  2. 30 0
      models/base_calculate.go

+ 109 - 0
controllers/base_from_calculate.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"sort"
 	"strconv"
 	"strings"
 	"sync"
@@ -2302,3 +2303,111 @@ func (this *CalculateController) BatchEditMulti() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// StepCalculate
+// @Title 多步骤计算
+// @Description 多步骤计算
+// @Param request body models.StepCalculateBySearchData true "type json string"
+// @Success Ret=200 返回指标id
+// @router /base/step_calculate [post]
+func (this *CalculateController) StepCalculate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.StepCalculateBySearchData
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析失败, Err: %v", e)
+		return
+	}
+	sort.Slice(req.Calculates, func(i, j int) bool {
+		return req.Calculates[i].Sort < req.Calculates[j].Sort
+	})
+
+	var errMsg string
+	originData, e := models.EdbInfoSearchDataToData(req.DataList)
+	if e != nil {
+		br.Msg = "基础数据异常"
+		br.ErrMsg = fmt.Sprintf("计算失败, 基础数据异常, Err: %v", e)
+		return
+	}
+
+	calculateData := originData
+	dateDataMap := make(map[time.Time]float64)
+	for _, v := range req.Calculates {
+		baseCalculate := models.BaseCalculate{
+			DataList:      calculateData,
+			Frequency:     v.Frequency,
+			Formula:       v.Formula,
+			Calendar:      v.Calendar,
+			MoveType:      v.MoveType,
+			MoveFrequency: v.MoveFrequency,
+			FromFrequency: v.FromFrequency,
+			Source:        v.Source,
+		}
+
+		//1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值
+		switch baseCalculate.Source {
+		case 1:
+			dateDataMap, e, errMsg = baseCalculate.Ljzzy()
+		case 2:
+			dateDataMap, e, errMsg = baseCalculate.Ljzzj()
+		case 3:
+			dateDataMap, e, errMsg = baseCalculate.Tbz()
+		case 4:
+			dateDataMap, e, errMsg = baseCalculate.Tcz()
+		case 5:
+			dateDataMap, e, errMsg = baseCalculate.Nszydpjjs()
+		case 6:
+			dateDataMap, e, errMsg = baseCalculate.Hbz()
+		case 7:
+			dateDataMap, e, errMsg = baseCalculate.Hcz()
+		case 8:
+			dateDataMap, e, errMsg = baseCalculate.UpFrequency()
+		case 9:
+			dateDataMap, e, errMsg = baseCalculate.DownFrequency()
+		case 10:
+			dateDataMap, e, errMsg = baseCalculate.TimeShift()
+		case 11:
+			dateDataMap, e, errMsg = baseCalculate.Cjjx()
+		case 12:
+			dateDataMap, e, errMsg = baseCalculate.Annualized()
+		case 13:
+			dateDataMap, e, errMsg = baseCalculate.Ljz()
+		case 14:
+			dateDataMap, e, errMsg = baseCalculate.LjzNczj()
+		case 15:
+			dateDataMap, e, errMsg = baseCalculate.ExponentialSmoothing()
+		case 16:
+			dateDataMap, e, errMsg = baseCalculate.Rjz()
+		default:
+			errMsg = "计算方式无效"
+			e = fmt.Errorf("%s:%d", errMsg, baseCalculate.Source)
+		}
+		if e != nil {
+			br.Msg = "计算失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = e.Error()
+			return
+		}
+
+		calculateData = models.TransDateData2EdbData(dateDataMap)
+	}
+	resultData, dates := models.GetDateDataAndDateList(dateDataMap)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "计算成功"
+	br.Data = models.BaseCalculateResp{
+		DataMap:  resultData,
+		DateList: dates,
+	}
+	br.IsAddLog = true
+}

+ 30 - 0
models/base_calculate.go

@@ -1812,3 +1812,33 @@ func GetDateDataAndDateList(dateDataMap map[time.Time]float64) (dateStrDataMap m
 
 	return
 }
+
+// StepCalculateBySearchData
+// @Description: 分步骤计算
+type StepCalculateBySearchData struct {
+	DataList   []*EdbInfoSearchData `description:"基础数据"`
+	Calculates []struct {
+		Formula       interface{}
+		Calendar      string `description:"公历/农历"`
+		Frequency     string `description:"需要转换的频度"`
+		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:日均值"`
+		Sort          int    `description:"计算顺序"`
+	}
+}
+
+func TransDateData2EdbData(dateData map[time.Time]float64) (edbData []*EdbInfoData) {
+	edbData = make([]*EdbInfoData, 0)
+	for d, v := range dateData {
+		edbData = append(edbData, &EdbInfoData{
+			DataTime: d,
+			Value:    v,
+		})
+	}
+	sort.Slice(edbData, func(i, j int) bool {
+		return edbData[i].DataTime.Before(edbData[j].DataTime)
+	})
+	return
+}