瀏覽代碼

Merge branch 'hotfix/resolve_refresh_panic' into debug

# Conflicts:
#	models/base_predict_from_calculate.go
xyxie 1 年之前
父節點
當前提交
2bd6772288
共有 4 個文件被更改,包括 155 次插入4 次删除
  1. 5 0
      logic/profit_chart_info.go
  2. 6 1
      models/base_from_calculate.go
  3. 139 2
      models/base_predict_from_calculate.go
  4. 5 1
      models/predict_edb.go

+ 5 - 0
logic/profit_chart_info.go

@@ -525,6 +525,11 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			}
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
+			nanCheck := fmt.Sprintf("%0.f", calVal)
+			// 分母为0.0的报错
+			if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+				continue
+			}
 			calVal, _ = decimal.NewFromFloat(calVal).Round(4).Float64()
 			yDataMap[tmpN] = calVal
 			xEdbInfoIdList = append(xEdbInfoIdList, tmpN)

+ 6 - 1
models/base_from_calculate.go

@@ -482,13 +482,18 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 		if calResult.IsNan() {
 			continue
 		}
+
 		calVal, err := calResult.Float64()
 		if err != nil {
 			err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
 			fmt.Println(err)
 			return err
 		}
-
+		nanCheck := fmt.Sprintf("%0.f", calVal)
+		// 分母为0.0的报错
+		if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+			continue
+		}
 		// 有计算出来值,那么就从待删除指标中移除
 		delete(removeDateMap, sk)
 		saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)

+ 139 - 2
models/base_predict_from_calculate.go

@@ -90,6 +90,139 @@ func EditPredictCalculate(edbInfo *EdbInfo, calculateMappingList []*EdbInfoCalcu
 }
 
 // AddPredictCalculateData 新增预测计算(运算)指标的数据
+func AddPredictCalculateDataBak(edbInfoIdList []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (latestDateStr string, latestValue float64, err error) {
+	o := orm.NewOrm()
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info(fmt.Sprintf("Calculate Err:%s" + err.Error()))
+		}
+	}()
+
+	var minLatestDate time.Time
+	oldSaveDataMap := make(map[string]map[int]float64)
+	saveDataMap := make(map[string]map[int]float64)
+	dateList := make([]string, 0)
+
+	for edbInfoIndex, v := range edbInfoIdList {
+		tmpLatestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
+		if tmpErr != nil {
+			err = errors.New(`最近的日期格式化失败;日期:` + v.LatestDate + `;err:` + tmpErr.Error())
+			return
+		}
+		// 如果不存在最小的真实数据日期,那么将当前指标的真实数据日期给赋值;
+		// 如果存在最小的真实数据日期,同时当前指标的真实数据日期 早于 最小的真实数据日期, 那么将当前指标的真实数据日期给赋值;
+		if minLatestDate.IsZero() || tmpLatestDate.Before(minLatestDate) {
+			minLatestDate = tmpLatestDate
+		}
+
+		dataList, tmpErr := GetPredictEdbDataListAll(v, 1)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		dataMap := make(map[string]float64)
+		for _, dv := range dataList {
+			// 现有实际数据
+			if val, ok := oldSaveDataMap[dv.DataTime]; ok {
+				if _, ok := val[v.EdbInfoId]; !ok {
+					val[v.EdbInfoId] = dv.Value
+				}
+			} else {
+				temp := make(map[int]float64)
+				temp[v.EdbInfoId] = dv.Value
+				oldSaveDataMap[dv.DataTime] = temp
+			}
+
+			// 待处理的数据
+			if val, ok := saveDataMap[dv.DataTime]; ok {
+				if _, ok := val[v.EdbInfoId]; !ok {
+					val[v.EdbInfoId] = dv.Value
+				}
+			} else {
+				temp := make(map[int]float64)
+				temp[v.EdbInfoId] = dv.Value
+				saveDataMap[dv.DataTime] = temp
+			}
+
+			// 以第一个指标的日期作为基准日期
+			if edbInfoIndex == 0 {
+				dateList = append(dateList, dv.DataTime)
+			}
+		}
+		item := new(PredictCalculateItems)
+		item.EdbInfoId = v.EdbInfoId
+		item.DataMap = dataMap
+	}
+
+	//数据处理,将日期内不全的数据做补全
+	handleDateSaveDataMap(dateList, oldSaveDataMap, saveDataMap, edbInfoIdList)
+
+	formulaMap := utils.CheckFormula(formulaStr)
+	addSql := ` INSERT INTO edb_data_predict_calculate (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	var isAdd bool
+
+	if !minLatestDate.IsZero() {
+		latestDateStr = minLatestDate.Format(utils.FormatDate)
+	}
+	for sk, sv := range saveDataMap {
+		formulaStr = strings.ToUpper(formulaStr)
+		formulaFormStr := ReplaceFormula(edbInfoIdList, sv, formulaMap, formulaStr, edbInfoIdBytes)
+		if formulaStr == "" {
+			return
+		}
+		if formulaFormStr != "" {
+			expression := formula.NewExpression(formulaFormStr)
+			calResult, tmpErr := expression.Evaluate()
+			if tmpErr != nil {
+				err = errors.New("计算失败:Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
+				fmt.Println(err)
+				return
+			}
+			calVal, tmpErr := calResult.Float64()
+			if tmpErr != nil {
+				err = errors.New("计算失败:获取计算值失败 Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
+				fmt.Println(err)
+				return
+			}
+
+			//需要存入的数据
+			{
+				if latestDateStr == sk {
+					nanCheck := fmt.Sprintf("%0.f", calVal)
+					// 分母为0.0的报错
+					if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+						err = errors.New("计算失败 分母为0:Err: formulaStr:" + formulaFormStr)
+						fmt.Println(err)
+						return
+					}
+					latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
+				}
+				dataTime, _ := time.ParseInLocation(utils.FormatDate, sk, time.Local)
+				timestamp := dataTime.UnixNano() / 1e6
+				timeStr := fmt.Sprintf("%d", timestamp)
+				addSql += "("
+				addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
+					"," + "'" + nowStr + "'" + "," + "'" + timeStr + "'"
+				addSql += "),"
+				isAdd = true
+			}
+		} else {
+			fmt.Println("formulaFormStr is empty")
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			fmt.Println("AddPredictCalculate Err:" + err.Error())
+			//errMsg = " tx.Exec Err :" + err.Error()
+			return
+		}
+	}
+	return
+}
+
 func AddPredictCalculateData(edbInfoIdList []*EdbInfo, edbInfo *EdbInfo, edbCode, formulaStr string, edbInfoIdBytes []string) (latestDateStr string, latestValue float64, err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
@@ -244,12 +377,16 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 				fmt.Println(err)
 				return
 			}
-
+			nanCheck := fmt.Sprintf("%0.f", calVal)
+			// 分母为0.0的报错
+			if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+				removeDateList = append(removeDateList, sk)
+				continue
+			}
 			// 最近实际日期的实际数据
 			if latestDateStr == sk {
 				latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
 			}
-
 			saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
 			if existVal, ok := dataMap[sk]; !ok {
 				dataTime, _ := time.ParseInLocation(utils.FormatDate, sk, time.Local)

+ 5 - 1
models/predict_edb.go

@@ -157,7 +157,11 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 			//fmt.Println(err)
 			return
 		}
-
+		nanCheck := fmt.Sprintf("%0.f", calVal)
+		if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+			removeDateList = append(removeDateList, sk)
+			continue
+		}
 		saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
 		existPredictEdbRuleData, ok := dataMap[sk]
 		if !ok {