Forráskód Böngészése

feat:新增预测指标运算

Roc 2 éve
szülő
commit
c271c72198

+ 2 - 2
controllers/base_from_predict_calculate.go

@@ -228,7 +228,7 @@ func (this *PredictCalculateController) Add() {
 	}
 
 	// 开始添加预测指标
-	err = models.AddPredictCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
+	latestDateStr, latestValue, err := models.AddPredictCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
 	if err != nil {
 		br.Msg = "生成计算指标失败"
 		br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
@@ -236,7 +236,7 @@ func (this *PredictCalculateController) Add() {
 	}
 
 	// 更新指标最大最小值
-	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	err, errMsg := models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = err.Error()

+ 38 - 18
models/base_predict_from_calculate.go

@@ -35,7 +35,7 @@ type PredictCalculateItems struct {
 }
 
 // AddPredictCalculate 新增预测计算(运算)指标的数据
-func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (err error) {
+func AddPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (latestDateStr string, latestValue float64, err error) {
 	o := orm.NewOrm()
 	defer func() {
 		if err != nil {
@@ -43,11 +43,24 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
 		}
 	}()
 
+	var minLatestDate time.Time
 	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
-		dataList, err := GetPredictEdbDataListAll(v, 1)
-		if err != nil {
-			return err
+	for _, 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 {
@@ -69,30 +82,37 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
 	addSql := ` INSERT INTO edb_predict_data_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(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
+		formulaFormStr := ReplaceFormula(edbInfoIdList, sv, formulaMap, formulaStr, edbInfoIdBytes)
 		if formulaStr == "" {
 			return
 		}
 		if formulaFormStr != "" {
 			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+			calResult, tmpErr := expression.Evaluate()
+			if tmpErr != nil {
+				err = errors.New("计算失败:Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
-				return err
+				return
 			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+			calVal, tmpErr := calResult.Float64()
+			if tmpErr != nil {
+				err = errors.New("计算失败:获取计算值失败 Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
-				return err
+				return
 			}
 
 			//需要存入的数据
 			{
-				dataTime, _ := time.Parse(utils.FormatDate, sk)
+				if latestDateStr == sk {
+					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 += "("
@@ -118,7 +138,7 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
 }
 
 // RefreshAllPredictCalculate 刷新预测计算指标的全部数据
-func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
+func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -134,7 +154,7 @@ func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int,
 	}()
 	fmt.Println(startDate, endDate)
 	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
+	for _, v := range edbInfoIdList {
 		var condition string
 		var pars []interface{}
 		condition += " AND edb_info_id=? "
@@ -193,7 +213,7 @@ func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int,
 	for sk, sv := range saveDataMap {
 		//fmt.Println(sk, sv)
 		formulaStr = strings.ToUpper(formulaStr)
-		formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
+		formulaFormStr := ReplaceFormula(edbInfoIdList, sv, formulaMap, formulaStr, edbInfoIdBytes)
 		if formulaFormStr != "" {
 			utils.FileLog.Info(fmt.Sprintf("formulaFormStr:%s", formulaFormStr))
 			expression := formula.NewExpression(formulaFormStr)

+ 37 - 0
models/edb_info.go

@@ -136,6 +136,7 @@ type EdbInfoMaxAndMinInfo struct {
 	MinValue    float64 `description:"最小值"`
 	MaxValue    float64 `description:"最大值"`
 	LatestValue float64 `description:"最新值"`
+	LatestDate  string  `description:"实际数据最新日期"`
 }
 
 // GetEdbInfoMaxAndMinInfo 获取指标的最新数据记录信息
@@ -305,6 +306,34 @@ func UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo *EdbInfo) (err error, errMsg stri
 	return
 }
 
+// UnifiedModifyPredictEdbInfoMaxAndMinInfo 统一修改预测运算指标的最大最小值
+func UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo *EdbInfo, latestDateStr string, latestValue float64) (err error, errMsg string) {
+	// 修改最大最小值
+	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(edbInfo.Source, edbInfo.EdbCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+			return
+		}
+
+		errMsg = "刷新指标失败!"
+		err = errors.New("获取指标最大最小值失败,err:" + err.Error())
+		return
+	}
+
+	if maxAndMinItem != nil {
+		maxAndMinItem.LatestDate = latestDateStr
+		maxAndMinItem.LatestValue = latestValue
+		err = ModifyPredictEdbInfoMaxAndMinInfo(edbInfo.EdbInfoId, maxAndMinItem)
+		if err != nil {
+			errMsg = "刷新指标失败!"
+			err = errors.New("修改指标最大最小值失败,err:" + err.Error())
+			return
+		}
+	}
+	return
+}
+
 // GetChartPredictEdbInfoDataList 获取图表的预测指标的未来数据
 func GetChartPredictEdbInfoDataList(predictEdbConf PredictEdbConf, latestDateStr string, lastDataValue float64, endDateStr, frequency string, order int) (predictEdbInfoData []*EdbInfoSearchData, err error) {
 	endDate, err := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
@@ -465,3 +494,11 @@ func GetPredictEdbDataListAll(edbInfo *EdbInfo, order int) (items []*EdbInfoSear
 	}
 	return
 }
+
+// ModifyPredictEdbInfoMaxAndMinInfo 修改预测指标的最新数据信息
+func ModifyPredictEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
+	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.LatestDate, item.LatestValue, edbInfoId).Exec()
+	return
+}