Эх сурвалжийг харах

Merge remote-tracking branch 'origin/debug' into debug

zwxi 1 жил өмнө
parent
commit
3c2add73fa

+ 1 - 1
controllers/base_from_calculate.go

@@ -1430,7 +1430,7 @@ func (this *CalculateController) Refresh() {
 			edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
 			edbInfoList = append(edbInfoList, edbInfo)
 		}
-		err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes, edbInfo.EmptyType, edbInfo.MaxEmptyType)
+		err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, subSource, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes, edbInfo.EmptyType, edbInfo.MaxEmptyType)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			errMsg = "RefreshCalculate Err:" + err.Error()
 			break

+ 9 - 102
models/base_from_calculate.go

@@ -39,92 +39,6 @@ type CalculateItems struct {
 	DataMap   map[string]float64
 }
 
-//// AddCalculate 新增计算(运算)指标
-//func AddCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (err error) {
-//	o := orm.NewOrm()
-//	defer func() {
-//		if err != nil {
-//			utils.FileLog.Info(fmt.Sprintf("Calculate Err:%s" + err.Error()))
-//		}
-//	}()
-//	saveDataMap := make(map[string]map[int]float64)
-//	for _, v := range edbInfoIdArr {
-//		var condition string
-//		var pars []interface{}
-//		condition += " AND edb_info_id=? "
-//		pars = append(pars, v.EdbInfoId)
-//		dataList, err := GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
-//		if err != nil {
-//			return err
-//		}
-//		dataMap := make(map[string]float64)
-//		for _, dv := range dataList {
-//			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
-//			}
-//		}
-//		item := new(CalculateItems)
-//		item.EdbInfoId = v.EdbInfoId
-//		item.DataMap = dataMap
-//	}
-//	formulaMap := utils.CheckFormula(formulaStr)
-//	addSql := ` INSERT INTO edb_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
-//	for sk, sv := range saveDataMap {
-//		formulaStr = strings.ToUpper(formulaStr)
-//		formulaFormStr := ReplaceFormula(edbInfoIdArr, 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)
-//				fmt.Println(err)
-//				return err
-//			}
-//			calVal, err := calResult.Float64()
-//			if err != nil {
-//				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-//				fmt.Println(err)
-//				return err
-//			}
-//
-//			//需要存入的数据
-//			{
-//				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("AddEdbDataCalculate Err:" + err.Error())
-//			//errMsg = " tx.Exec Err :" + err.Error()
-//			return
-//		}
-//	}
-//	return
-//}
-
 // AddCalculateInfo 新增计算(运算)指标
 func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbInfoCalculateMapping, edbInfoList []*EdbInfo, edbCode, uniqueCode string, edbInfoIdBytes []string) (edbInfo *EdbInfo, err error) {
 
@@ -392,8 +306,6 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 			return err
 		}
 
-		lenData := len(dataList)
-
 		for _, dv := range dataList {
 			if val, ok := realSaveDataMap[dv.DataTime]; ok {
 				if _, ok := val[v.EdbInfoId]; !ok {
@@ -419,18 +331,13 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 			// 以第一个指标的日期作为基准日期
 			if edbInfoIndex == 0 {
 				dateList = append(dateList, dv.DataTime)
-			}
-		}
-
-		if lenData > 0 {
-			tmpLatestDate, _ := time.ParseInLocation(utils.FormatDate, dataList[lenData-1].DataTime, time.Local)
-			if minLatestDate.IsZero() || minLatestDate.After(tmpLatestDate) {
-				minLatestDate = tmpLatestDate
-			}
-
-			tmpStartDate, _ := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
-			if maxStartDate.IsZero() || maxStartDate.Before(tmpStartDate) {
-				maxStartDate = tmpStartDate
+				tmpDate, _ := time.ParseInLocation(utils.FormatDate, dv.DataTime, time.Local)
+				if minLatestDate.IsZero() || tmpDate.After(minLatestDate) {
+					minLatestDate = tmpDate
+				}
+				if maxStartDate.IsZero() || tmpDate.Before(maxStartDate) {
+					maxStartDate = tmpDate
+				}
 			}
 		}
 	}
@@ -438,7 +345,7 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 	//数据处理,将日期内不全的数据做补全
 	HandleDateSaveDataMap(dateList, maxStartDate, minLatestDate, realSaveDataMap, saveDataMap, edbInfoIdArr, emptyType)
 
-	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, maxStartDate.Format(utils.FormatDate))
+	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, minLatestDate)
 	if err != nil {
 		return
 	}
@@ -481,7 +388,7 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 		formulaMap := make(map[string]string)
 		formulaStr = ""
 		for _, fv := range formulaDateSlice {
-			if sk >= fv {
+			if sk < fv {
 				if f, ok := formulaDateMap[fv]; ok {
 					formulaStr = f
 					formulaMap = utils.CheckFormula(formulaStr)

+ 15 - 5
models/base_predict_from_calculate.go

@@ -257,7 +257,9 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source, sub
 			_ = to.Commit()
 		}
 	}()
+
 	latestDateStr, latestValue, err = refreshAllPredictCalculate(to, edbInfoIdList, edbInfoId, source, subSource, edbCode, formulaStr, startDate, edbInfoIdBytes, emptyType, maxEmptyType)
+
 	return
 }
 
@@ -266,7 +268,7 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 	fmt.Println("startDate:", startDate)
 
 	// 实际数据最小的结束日期 ,最小的结束日期 , 最晚的数据开始日期
-	var minLatestDate, minEndDate, maxStartDate time.Time
+	var minLatestDate, maxStartDate time.Time
 	dateList := make([]string, 0) // 第一个指标的日期数据
 
 	realSaveDataMap := make(map[string]map[int]float64)
@@ -274,7 +276,7 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 
 	for edbInfoIndex, v := range edbInfoIdList {
 		// 单独存储max、min函数里的指标的数据
-		tmpLatestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
+		/*tmpLatestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
 		if tmpErr != nil {
 			err = errors.New(`最近的日期格式化失败;日期:` + v.LatestDate + `;err:` + tmpErr.Error())
 			return
@@ -298,6 +300,7 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 		if minEndDate.IsZero() || tmpEndDate.Before(minEndDate) {
 			minEndDate = tmpEndDate
 		}
+		}*/
 
 		// 获取关联指标数据
 		dataList, tmpErr := GetPredictEdbDataListAllByStartDate(v, 1, startDate)
@@ -329,14 +332,21 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 			}
 			if edbInfoIndex == 0 {
 				dateList = append(dateList, dv.DataTime)
+				tmpDate, _ := time.ParseInLocation(utils.FormatDate, dv.DataTime, time.Local)
+				if minLatestDate.IsZero() || tmpDate.After(minLatestDate) {
+					minLatestDate = tmpDate
+				}
+				if maxStartDate.IsZero() || tmpDate.Before(maxStartDate) {
+					maxStartDate = tmpDate
+				}
 			}
 		}
 	}
-	
+
 	//数据处理,将日期内不全的数据做填补
 	HandleDateSaveDataMap(dateList, maxStartDate, minLatestDate, realSaveDataMap, saveDataMap, edbInfoIdList, emptyType)
 
-	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, maxStartDate.Format(utils.FormatDate))
+	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, minLatestDate)
 	if err != nil {
 		return
 	}
@@ -381,7 +391,7 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 		formulaMap := make(map[string]string)
 		formulaStr = ""
 		for _, fv := range formulaDateSlice {
-			if sk >= fv {
+			if sk < fv {
 				if f, ok := formulaDateMap[fv]; ok {
 					formulaStr = f
 					formulaMap = utils.CheckFormula(formulaStr)

+ 12 - 5
models/predict_edb.go

@@ -65,7 +65,7 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 			return
 		}
 
-		lenData := len(dataList)
+		//lenData := len(dataList)
 		for edbInfoIndex, dv := range dataList {
 			// 现有实际数据
 			if val, ok := realSaveDataMap[dv.DataTime]; ok {
@@ -92,10 +92,17 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 			// 以第一个指标的日期作为基准日期
 			if edbInfoIndex == 0 {
 				dateList = append(dateList, dv.DataTime)
+				tmpDate, _ := time.ParseInLocation(utils.FormatDate, dv.DataTime, time.Local)
+				if minLatestDate.IsZero() || tmpDate.After(minLatestDate) {
+					minLatestDate = tmpDate
+				}
+				if maxStartDate.IsZero() || tmpDate.Before(maxStartDate) {
+					maxStartDate = tmpDate
+				}
 			}
 		}
 
-		if lenData > 0 {
+		/*if lenData > 0 {
 			tmpLatestDate, _ := time.ParseInLocation(utils.FormatDate, dataList[lenData-1].DataTime, time.Local)
 			if minLatestDate.IsZero() || minLatestDate.After(tmpLatestDate) {
 				minLatestDate = tmpLatestDate
@@ -105,7 +112,7 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 			if maxStartDate.IsZero() || maxStartDate.Before(tmpStartDate) {
 				maxStartDate = tmpStartDate
 			}
-		}
+		}*/
 	}
 
 	// todo 数据处理,将日期内不全的数据做填补
@@ -115,7 +122,7 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 	addDataList := make([]*PredictEdbRuleData, 0)
 
 	// 计算规则
-	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, maxStartDate.Format(utils.FormatDate))
+	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, minLatestDate)
 	if err != nil {
 		return
 	}
@@ -150,7 +157,7 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 		formulaMap := make(map[string]string)
 		formulaStr = ""
 		for _, fv := range formulaDateSlice {
-			if sk >= fv {
+			if sk < fv {
 				if f, ok := formulaDateMap[fv]; ok {
 					formulaStr = f
 					formulaMap = utils.CheckFormula(formulaStr)

+ 20 - 13
services/base_from_predict.go

@@ -94,7 +94,7 @@ func CalculateByRuleByNine(formulaStr string, edbInfoList []*models.EdbInfo, edb
 			return
 		}
 		dataMap := make(map[string]float64)
-		lenData := len(sourceDataList)
+		//lenData := len(sourceDataList)
 		for _, dv := range sourceDataList {
 			// 实际数据
 			if val, ok := realSaveDataMap[dv.DataTime]; ok {
@@ -121,19 +121,26 @@ func CalculateByRuleByNine(formulaStr string, edbInfoList []*models.EdbInfo, edb
 			// 以第一个指标的日期作为基准日期
 			if edbInfoIndex == 0 {
 				dateList = append(dateList, dv.DataTime)
-			}
-
-			if lenData > 0 {
-				tmpLatestDate, _ := time.ParseInLocation(utils.FormatDate, sourceDataList[lenData-1].DataTime, time.Local)
-				if minLatestDate.IsZero() || minLatestDate.After(tmpLatestDate) {
-					minLatestDate = tmpLatestDate
+				tmpDate, _ := time.ParseInLocation(utils.FormatDate, dv.DataTime, time.Local)
+				if minLatestDate.IsZero() || tmpDate.After(minLatestDate) {
+					minLatestDate = tmpDate
 				}
-
-				tmpStartDate, _ := time.ParseInLocation(utils.FormatDate, sourceDataList[0].DataTime, time.Local)
-				if maxStartDate.IsZero() || maxStartDate.Before(tmpStartDate) {
-					maxStartDate = tmpStartDate
+				if maxStartDate.IsZero() || tmpDate.Before(maxStartDate) {
+					maxStartDate = tmpDate
 				}
 			}
+
+			/*			if lenData > 0 {
+						tmpLatestDate, _ := time.ParseInLocation(utils.FormatDate, sourceDataList[lenData-1].DataTime, time.Local)
+						if minLatestDate.IsZero() || minLatestDate.After(tmpLatestDate) {
+							minLatestDate = tmpLatestDate
+						}
+
+						tmpStartDate, _ := time.ParseInLocation(utils.FormatDate, sourceDataList[0].DataTime, time.Local)
+						if maxStartDate.IsZero() || maxStartDate.Before(tmpStartDate) {
+							maxStartDate = tmpStartDate
+						}
+					}*/
 		}
 		item := new(models.CalculateItems)
 		item.EdbInfoId = v.EdbInfoId
@@ -145,7 +152,7 @@ func CalculateByRuleByNine(formulaStr string, edbInfoList []*models.EdbInfo, edb
 	dataList = make([]*models.EdbDataList, 0)
 
 	// 计算规则
-	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, maxStartDate.Format(utils.FormatDate))
+	formulaDateSlice, formulaDateMap, err := utils.HandleFormulaJson(formulaStr, minLatestDate)
 	if err != nil {
 		return
 	}
@@ -168,7 +175,7 @@ func CalculateByRuleByNine(formulaStr string, edbInfoList []*models.EdbInfo, edb
 		formulaMap := make(map[string]string)
 		formulaStr = ""
 		for _, fv := range formulaDateSlice {
-			if date >= fv {
+			if date < fv {
 				if f, ok := formulaDateMap[fv]; ok {
 					formulaStr = f
 					formulaMap = utils.CheckFormula(formulaStr)

+ 6 - 3
utils/base_from_calculate.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"sort"
 	"strings"
+	"time"
 )
 
 // CheckFormula 检测计算公式是否异常
@@ -37,7 +38,7 @@ type FormulaListItem struct {
 }
 
 // HandleFormulaJson 处理计算公式json串是否异常
-func HandleFormulaJson(formula string, startDate string) (dateSlice []string, formulaMap map[string]string, err error) {
+func HandleFormulaJson(formula string, endDate time.Time) (dateSlice []string, formulaMap map[string]string, err error) {
 	list := make([]FormulaListItem, 0)
 	err = json.Unmarshal([]byte(formula), &list)
 	if err != nil {
@@ -46,16 +47,18 @@ func HandleFormulaJson(formula string, startDate string) (dateSlice []string, fo
 	}
 	formulaMap = make(map[string]string)
 	dateSlice = make([]string, 0)
+	// 查找最后的一天作为首个公式的起始日期
+	maxDate := endDate.AddDate(0, 0, 1).Format(FormatDate)
 	// 日期排序
 	for k, v := range list {
 		if k == 0 { // 首个日期均为起始日
-			v.Date = startDate
+			v.Date = maxDate
 		}
 		formulaMap[v.Date] = v.Formula
 		dateSlice = append(dateSlice, v.Date)
 	}
 	sort.Slice(dateSlice, func(i, j int) bool {
-		return dateSlice[i] > dateSlice[j]
+		return dateSlice[i] < dateSlice[j]
 	})
 
 	return