Browse Source

预测指标 动态环差运算调整

xyxie 1 year ago
parent
commit
6e28aae38b
2 changed files with 75 additions and 33 deletions
  1. 69 33
      logic/predict_edb.go
  2. 6 0
      models/predict_edb_conf.go

+ 69 - 33
logic/predict_edb.go

@@ -199,12 +199,20 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 				formulaStr += tmpEdbInfoId.FromTag + ","
 				edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
 			}
-			formulaMap := utils.CheckFormula(formula)
-			for _, formula := range formulaMap {
-				if !strings.Contains(formulaStr, formula) {
-					errMsg = "公式错误,请重新填写"
-					err = errors.New(errMsg)
-					return
+			formulaSlice, tErr := utils.CheckFormulaJson(formula)
+			if tErr != nil {
+				errMsg = "公式格式错误,请重新填写"
+				err = errors.New(errMsg)
+				return
+			}
+			for _, fm := range formulaSlice {
+				formulaMap := utils.CheckFormula(fm)
+				for _, f := range formulaMap {
+					if !strings.Contains(formulaStr, f) {
+						errMsg = "公式错误,请重新填写"
+						err = errors.New(errMsg)
+						return
+					}
 				}
 			}
 
@@ -269,12 +277,17 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 				}
 				trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
 			}
-			ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
-			if !ok {
-				errMsg = "生成计算指标失败,请使用正确的计算公式"
-				err = errors.New(errMsg)
-				return
+			for _, f := range formulaSlice {
+				formulaMap := utils.CheckFormula(f)
+				//预先计算,判断公式是否正常
+				ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes)
+				if !ok {
+					errMsg = "生成计算指标失败,请使用正确的计算公式"
+					err = errors.New(errMsg)
+					return
+				}
 			}
+
 			calculateRuleMap[ruleIndex] = models.CalculateRule{
 				TrendsCalculateMappingList: trendsMappingList,
 				EdbInfoList:                edbInfoList,
@@ -569,12 +582,21 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 				formulaStr += tmpEdbInfoId.FromTag + ","
 				edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
 			}
-			formulaMap := utils.CheckFormula(formula)
-			for _, formula := range formulaMap {
-				if !strings.Contains(formulaStr, formula) {
-					errMsg = "公式错误,请重新填写"
-					err = errors.New(errMsg)
-					return
+
+			formulaSlice, tErr := utils.CheckFormulaJson(formula)
+			if tErr != nil {
+				errMsg = "公式格式错误,请重新填写"
+				err = errors.New(errMsg)
+				return
+			}
+			for _, fm := range formulaSlice {
+				formulaMap := utils.CheckFormula(fm)
+				for _, f := range formulaMap {
+					if !strings.Contains(formulaStr, f) {
+						errMsg = "公式错误,请重新填写"
+						err = errors.New(errMsg)
+						return
+					}
 				}
 			}
 
@@ -639,13 +661,17 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 				}
 				trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
 			}
-			ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
-			if !ok {
-				errMsg = "生成计算指标失败,请使用正确的计算公式"
-				err = errors.New(errMsg)
-				return
-			}
 
+			for _, f := range formulaSlice {
+				formulaMap := utils.CheckFormula(f)
+				//预先计算,判断公式是否正常
+				ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes)
+				if !ok {
+					errMsg = "生成计算指标失败,请使用正确的计算公式"
+					err = errors.New(errMsg)
+					return
+				}
+			}
 			calculateRuleMap[ruleIndex] = models.CalculateRule{
 				TrendsCalculateMappingList: trendsMappingList,
 				EdbInfoList:                edbInfoList,
@@ -873,19 +899,29 @@ func RefreshPredictEdbInfo(edbInfoId int) (edbInfo *models.EdbInfo, err error, e
 				formulaStr += tmpEdbInfoId.FromTag + ","
 				edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
 			}
-			formulaMap := utils.CheckFormula(formula)
-			for _, formula := range formulaMap {
-				if !strings.Contains(formulaStr, formula) {
-					errMsg = "公式错误,请重新填写"
-					return
-				}
-			}
 
-			ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
-			if !ok {
-				errMsg = "生成计算指标失败,请使用正确的计算公式"
+			formulaSlice, tErr := utils.CheckFormulaJson(formula)
+			if tErr != nil {
+				errMsg = "公式格式错误,请重新填写"
+				err = errors.New(errMsg)
 				return
 			}
+			for _, fm := range formulaSlice {
+				formulaMap := utils.CheckFormula(fm)
+				for _, f := range formulaMap {
+					if !strings.Contains(formulaStr, f) {
+						errMsg = "公式错误,请重新填写"
+						err = errors.New(errMsg)
+						return
+					}
+				}
+				//预先计算,判断公式是否正常
+				ok, _ := models.CheckFormula2(edbInfoList, formulaMap, fm, edbInfoIdBytes)
+				if !ok {
+					errMsg = "生成计算指标失败,请使用正确的计算公式"
+					return
+				}
+			}
 
 			rule := models.CalculateRule{
 				EdbInfoId:                  v.PredictEdbInfoId,

+ 6 - 0
models/predict_edb_conf.go

@@ -24,6 +24,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 []EdbInfoFromTag `description:"指标信息"`
 }
@@ -43,6 +45,8 @@ type PredictEdbConf struct {
 	RuleType         int       `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值"`
 	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:"添加时间"`
@@ -56,6 +60,8 @@ type PredictEdbConfAndData 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:"添加时间"`