Ver Fonte

fix:新增指标计算接口

Roc há 1 ano atrás
pai
commit
a6bc72dd23
3 ficheiros alterados com 341 adições e 210 exclusões
  1. 25 4
      controllers/base_from_calculate.go
  2. 226 206
      models/base_calculate.go
  3. 90 0
      models/handle_data.go

+ 25 - 4
controllers/base_from_calculate.go

@@ -2072,17 +2072,35 @@ func (this *CalculateController) Calculate() {
 		this.ServeJSON()
 	}()
 
-	var baseCalculate models.BaseCalculate
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &baseCalculate)
+	var req models.BaseCalculateBySearchData
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
 
-	dateDataMap := make(map[string]float64)
+	dateDataMap := make(map[time.Time]float64)
 	var errMsg string
 
+	dataList, err := models.EdbInfoSearchDataToData(req.DataList)
+	if err != nil {
+		br.Msg = "计算失败,数据异常!"
+		br.ErrMsg = "计算失败,数据异常,Err:" + err.Error()
+		return
+	}
+
+	baseCalculate := models.BaseCalculate{
+		DataList:      dataList,
+		Frequency:     req.Frequency,
+		Formula:       req.Formula,
+		Calendar:      req.Calendar,
+		MoveType:      req.MoveType,
+		MoveFrequency: req.MoveFrequency,
+		FromFrequency: req.FromFrequency,
+		Source:        req.Source,
+	}
+
 	//1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值
 	switch baseCalculate.Source {
 	case 1:
@@ -2130,11 +2148,14 @@ func (this *CalculateController) Calculate() {
 		br.ErrMsg = err.Error()
 	}
 
+	dateStrDataMap, dateList := models.GetDateDataAndDateList(dateDataMap)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "计算成功"
 	br.Data = models.BaseCalculateResp{
-		DataMap: dateDataMap,
+		DataMap:  dateStrDataMap,
+		DateList: dateList,
 	}
 	br.IsAddLog = true
 }

Diff do ficheiro suprimidas por serem muito extensas
+ 226 - 206
models/base_calculate.go


+ 90 - 0
models/handle_data.go

@@ -139,3 +139,93 @@ func HandleDataByPreviousData(edbInfoDataList []*EdbInfoSearchData, handleDataMa
 
 	return
 }
+
+// HandleDataByLinearRegressionByTime 插值法补充数据(线性方程式) 时间为日期格式,而不是字符串
+func HandleDataByLinearRegressionByTime(edbInfoDataList []*EdbInfoData, handleDataMap map[time.Time]float64) (newList []*EdbInfoData, err error) {
+	if len(edbInfoDataList) < 2 {
+		return
+	}
+
+	var startEdbInfoData *EdbInfoData
+	for _, v := range edbInfoDataList {
+		handleDataMap[v.DataTime] = v.Value
+
+		// 第一个数据就给过滤了,给后面的试用
+		if startEdbInfoData == nil {
+			startEdbInfoData = v
+			newList = append(newList, &EdbInfoData{
+				EdbDataId: v.EdbDataId,
+				DataTime:  v.DataTime,
+				Value:     v.Value,
+			})
+			continue
+		}
+
+		// 获取两条数据之间相差的天数
+		startDataTime := startEdbInfoData.DataTime
+		currDataTime := v.DataTime
+		betweenHour := int(currDataTime.Sub(startDataTime).Hours())
+		betweenDay := betweenHour / 24
+
+		// 如果相差一天,那么过滤
+		if betweenDay <= 1 {
+			startEdbInfoData = v
+			newList = append(newList, &EdbInfoData{
+				EdbDataId: v.EdbDataId,
+				DataTime:  v.DataTime,
+				Value:     v.Value,
+			})
+			continue
+		}
+
+		// 生成线性方程式
+		var a, b float64
+		{
+			coordinateData := make([]utils.Coordinate, 0)
+			tmpCoordinate1 := utils.Coordinate{
+				X: 1,
+				Y: startEdbInfoData.Value,
+			}
+			coordinateData = append(coordinateData, tmpCoordinate1)
+			tmpCoordinate2 := utils.Coordinate{
+				X: float64(betweenDay) + 1,
+				Y: v.Value,
+			}
+			coordinateData = append(coordinateData, tmpCoordinate2)
+
+			a, b = utils.GetLinearResult(coordinateData)
+			if math.IsNaN(a) || math.IsNaN(b) {
+				err = errors.New("线性方程公式生成失败")
+				return
+			}
+		}
+
+		// 生成对应的值
+		{
+			for i := 1; i < betweenDay; i++ {
+				tmpDataTime := startDataTime.AddDate(0, 0, i)
+				aDecimal := decimal.NewFromFloat(a)
+				xDecimal := decimal.NewFromInt(int64(i) + 1)
+				bDecimal := decimal.NewFromFloat(b)
+
+				val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
+				handleDataMap[tmpDataTime] = val
+				newList = append(newList, &EdbInfoData{
+					DataTime: tmpDataTime,
+					Value:    val,
+				})
+			}
+		}
+
+		// 最后将自己赋值
+		newList = append(newList, &EdbInfoData{
+			EdbDataId: v.EdbDataId,
+			DataTime:  v.DataTime,
+			Value:     v.Value,
+		})
+
+		startEdbInfoData = v
+	}
+
+	return
+}

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff