Ver código fonte

fix:计算指标分母为0的bug修复

Roc 3 anos atrás
pai
commit
a6c062db86

+ 8 - 2
models/data_manage/edb_data_calculate.go

@@ -22,7 +22,6 @@ func ModifyEdbDataCalculate(edbInfoId int64, dataTime string, value float64) (er
 	return
 }
 
-
 func AddEdbDataCalculateBySql(sqlStr string) (err error) {
 	o := orm.NewOrm()
 	o.Using("data")
@@ -30,6 +29,13 @@ func AddEdbDataCalculateBySql(sqlStr string) (err error) {
 	return
 }
 
+// DeleteEdbDataCalculateBySql 根据删除sql删除指标数据
+func DeleteEdbDataCalculateBySql(deleteStr string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	_, err = o.Raw(deleteStr).Exec()
+	return
+}
 
 type EdbInfoCalculateDetail struct {
 	EdbInfoCalculateId int       `orm:"column(edb_info_calculate_id);pk"`
@@ -69,4 +75,4 @@ func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfoCalculateDeta
 	sql = fmt.Sprintf(sql, calculateTableName)
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
 	return
-}
+}

+ 18 - 1
services/data/data_calculate.go

@@ -60,6 +60,7 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
 	nowStr := time.Now().Format(utils.FormatDateTime)
 	var isAdd bool
+	removeDateList := make([]string, 0) //需要移除的日期
 
 	for sk, sv := range saveDataMap {
 		formulaStr = strings.ToUpper(formulaStr)
@@ -69,6 +70,11 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			expression := formula.NewExpression(formulaFormStr)
 			calResult, err := expression.Evaluate()
 			if err != nil {
+				// 分母为0的报错
+				if strings.Contains(err.Error(), "divide by zero") {
+					removeDateList = append(removeDateList, sk)
+					continue
+				}
 				err = errors.New("计算失败,edbCode:" + fmt.Sprint(edbCode) + ":Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
 				return err
@@ -105,11 +111,22 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		data_manage.AddEdbDataCalculateBySql(addSql)
+		err = data_manage.AddEdbDataCalculateBySql(addSql)
 		if err != nil {
 			fmt.Println("AddEdbDataCalculate Err:" + err.Error())
 			return err
 		}
 	}
+	if len(removeDateList) > 0 {
+		removeDateStr := strings.Join(removeDateList, `","`)
+		removeDateStr = `"` + removeDateStr + `"`
+		//如果拼接指标变更了,那么需要删除所有的指标数据
+		sql := fmt.Sprintf(` DELETE FROM edb_data_calculate WHERE edb_info_id = ? and data_time in (%s) `, removeDateStr)
+		err = data_manage.DeleteEdbDataCalculateBySql(sql)
+		if err != nil {
+			err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
+			return
+		}
+	}
 	return
 }