Browse Source

指标运算改版

xyxie 1 year ago
parent
commit
b7ebfcc25a

+ 17 - 5
controllers/data_manage/edb_info_calculate.go

@@ -134,11 +134,19 @@ func (this *ChartInfoController) CalculateSave() {
 		formulaStr += v.FromTag + ","
 		edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
 	}
-	formulaMap := data.CheckFormula(req.CalculateFormula)
-	for _, v := range formulaMap {
-		if !strings.Contains(formulaStr, v) {
-			br.Msg = "公式错误,请重新填写"
-			return
+
+	formulaSlice, err := data.CheckFormulaJson(req.CalculateFormula)
+	if err != nil {
+		br.Msg = "公式格式错误,请重新填写"
+		return
+	}
+	for _, formula := range formulaSlice {
+		formulaMap := data.CheckFormula(formula)
+		for _, v := range formulaMap {
+			if !strings.Contains(formulaStr, v) {
+				br.Msg = "公式错误,请重新填写"
+				return
+			}
 		}
 	}
 
@@ -153,6 +161,8 @@ func (this *ChartInfoController) CalculateSave() {
 		ClassifyId:       req.ClassifyId,
 		CalculateFormula: req.CalculateFormula,
 		EdbInfoIdArr:     req.EdbInfoIdArr,
+		EmptyType:        req.EmptyType,
+		MaxEmptyType:     req.MaxEmptyType,
 	}
 	reqJson, err := json.Marshal(req2)
 	if err != nil {
@@ -422,6 +432,8 @@ func (this *ChartInfoController) CalculateEdit() {
 		ClassifyId:       req.ClassifyId,
 		CalculateFormula: req.CalculateFormula,
 		EdbInfoIdArr:     req.EdbInfoIdArr,
+		EmptyType:        req.EmptyType,
+		MaxEmptyType:     req.MaxEmptyType,
 	}
 	reqJson, err := json.Marshal(req2)
 	if err != nil {

+ 6 - 0
models/data_manage/edb_info_calculate.go

@@ -18,6 +18,8 @@ type EdbInfoCalculateSaveReq struct {
 	ClassifyId       int              `description:"分类id"`
 	CalculateFormula string           `description:"计算公式"`
 	Calendar         string           `description:"公历/农历"`
+	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 }
 
@@ -107,6 +109,8 @@ type EdbInfoCalculateEditReq struct {
 	Unit             string           `description:"单位"`
 	ClassifyId       int              `description:"分类id"`
 	CalculateFormula string           `description:"计算公式"`
+	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 }
 
@@ -200,6 +204,8 @@ type EdbInfoCalculateBatchSaveReqByEdbLib struct {
 	MoveFrequency    string           `description:"移动频度:天/周/月/季/年"`
 	Calendar         string           `description:"公历/农历"`
 	Data             interface{}      `description:"数据列"`
+	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 }
 
 // EdbInfoCalculateBatchEditReqByEdbLib 编辑计算指标的请求参数

+ 2 - 0
models/data_manage/predict_edb_conf.go

@@ -14,6 +14,8 @@ type PredictEdbConf struct {
 	RuleType         int       `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差"`
 	FixedValue       float64   `description:"固定值"`
 	Value            string    `description:"配置的值"`
+	EmptyType        int       `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int       `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	EndDate          time.Time `description:"截止日期"`
 	ModifyTime       time.Time `description:"修改时间"`
 	CreateTime       time.Time `description:"添加时间"`

+ 2 - 0
models/data_manage/predict_edb_info_calculate.go

@@ -10,6 +10,8 @@ type PredictEdbInfoCalculateSaveReq struct {
 	Unit             string           `description:"单位"`
 	ClassifyId       int              `description:"分类id"`
 	CalculateFormula string           `description:"计算公式"`
+	EmptyType        int              `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int              `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	EdbInfoIdArr     []EdbInfoFromTag `description:"指标信息"`
 }
 

+ 2 - 0
models/data_manage/request/predict_edb_info.go

@@ -42,6 +42,8 @@ type AddPredictEdbInfoReq struct {
 type RuleConfig struct {
 	RuleType     int                          `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差"`
 	Value        string                       `description:"值"`
+	EmptyType    int                          `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType int                          `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	EndDate      string                       `description:"截止日期"`
 	EdbInfoIdArr []data_manage.EdbInfoFromTag `description:"指标信息"`
 }

+ 21 - 0
services/data/edb_info_calculate.go

@@ -57,6 +57,27 @@ func CheckFormula2(edbInfoArr []*data_manage.EdbInfo, formulaMap map[string]stri
 	return
 }
 
+type FormulaListItem struct {
+	Formula string `json:"f"`
+	Date    string `json:"d"`
+}
+
+// CheckFormulaJson 检测计算公式json串是否异常
+func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
+	list := make([]FormulaListItem, 0)
+	err = json.Unmarshal([]byte(formula), &list)
+	if err != nil {
+		err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
+		return
+	}
+	formulaSlice = make([]string, 0)
+	// 日期排序
+	for _, v := range list {
+		formulaSlice = append(formulaSlice, v.Formula)
+	}
+	return
+}
+
 type CalculateItems struct {
 	EdbInfoId int
 	DataMap   map[string]float64