Sfoglia il codice sorgente

Merge branch 'chart/11.6' into debug

# Conflicts:
#	models/edb_info.go
#	models/predict_edb_info_rule.go
Roc 2 anni fa
parent
commit
0a010ae3d6

+ 9 - 9
controllers/base_from_calculate.go

@@ -1126,7 +1126,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		err = models.RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1144,7 +1144,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		err = models.RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1162,7 +1162,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		err = models.RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1181,7 +1181,7 @@ func (this *CalculateController) Refresh() {
 			break
 		}
 		formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
@@ -1198,7 +1198,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
 		err = models.RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
@@ -1217,7 +1217,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
 		err = models.RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
@@ -1236,7 +1236,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		err = models.RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1254,7 +1254,7 @@ func (this *CalculateController) Refresh() {
 			errMsg = "GetEdbInfoById Err:" + err.Error()
 			break
 		}
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		endDate = time.Now().Format(utils.FormatDate)
 		formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
 		err = models.RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
@@ -1305,7 +1305,7 @@ func (this *CalculateController) Refresh() {
 			break
 		}
 		formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-		startDate = edbInfo.StartDate
+		//startDate = edbInfo.StartDate
 		err = models.RefreshAllCalculateCjjx(edbInfoId, edbInfo.Source, fromEdbInfo, calculateCjjx.EdbCode, startDate, "", formulaInt)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			errMsg = "RefreshAllCalculateCjjx Err:" + err.Error()

+ 9 - 7
controllers/base_from_cffex.go

@@ -88,16 +88,18 @@ func (this *CffexController) Refresh() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		err = models.RefreshEdbDataFromCffex(req.EdbInfoId, req.EdbCode, req.StartDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "刷新指标信息失败!"

+ 8 - 7
controllers/base_from_coal.go

@@ -88,16 +88,17 @@ func (this *CoalController) Refresh() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		err = models.RefreshEdbDataFromCoal(req.EdbInfoId, req.EdbCode, req.StartDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "刷新指标信息失败!"

+ 16 - 14
controllers/base_from_dl.go

@@ -39,13 +39,6 @@ func (this *DlController) Add() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
@@ -55,13 +48,6 @@ func (this *DlController) Add() {
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromDl,Err:" + err.Error()
 			return
 		}
-		// 更新指标最大最小值
-		err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
-		if err != nil {
-			br.Msg = errMsg
-			br.ErrMsg = err.Error()
-			return
-		}
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -111,6 +97,22 @@ func (this *DlController) Refresh() {
 			br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromDl,Err:" + err.Error()
 			return
 		}
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+		// 更新指标最大最小值
+		err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"

+ 16 - 14
controllers/base_from_gie.go

@@ -39,13 +39,6 @@ func (this *GieController) Add() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
@@ -55,13 +48,6 @@ func (this *GieController) Add() {
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromGie,Err:" + err.Error()
 			return
 		}
-		// 更新指标最大最小值
-		err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
-		if err != nil {
-			br.Msg = errMsg
-			br.ErrMsg = err.Error()
-			return
-		}
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -111,6 +97,22 @@ func (this *GieController) Refresh() {
 			br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromGie,Err:" + err.Error()
 			return
 		}
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+		// 更新指标最大最小值
+		err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"

+ 9 - 7
controllers/base_from_google_travel.go

@@ -88,16 +88,18 @@ func (this *GoogleTravelController) Refresh() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		err = models.RefreshEdbDataGoogleTravel(req.EdbInfoId, req.EdbCode, req.StartDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "刷新指标信息失败!"

+ 9 - 8
controllers/base_from_lt.go

@@ -94,17 +94,18 @@ func (this *LtController) Refresh() {
 		br.ErrMsg = "请输入指标ID"
 		return
 	}
-
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		dataItem, err := services.GetEdbDataFromLt(req.EdbCode, req.StartDate, utils.BASE_END_DATE)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"

+ 9 - 8
controllers/base_from_lz.go

@@ -87,17 +87,18 @@ func (this *LzController) Refresh() {
 		br.ErrMsg = "请输入指标ID"
 		return
 	}
-
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		err = models.RefreshEdbDataFromLz(req.EdbInfoId, req.EdbCode, req.StartDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "刷新指标信息失败!"

+ 9 - 7
controllers/base_from_manual.go

@@ -88,16 +88,18 @@ func (this *ManualController) Refresh() {
 		return
 	}
 
-	// 获取指标详情
-	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
-	if err != nil {
-		br.Msg = "指标不存在!"
-		br.ErrMsg = "指标不存在"
-		return
-	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+
+		// 获取指标详情
+		edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+
 		err = models.RefreshEdbDataFromManual(req.EdbInfoId, req.EdbCode, req.StartDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "刷新指标信息失败!"

+ 8 - 0
models/edb_info.go

@@ -555,6 +555,14 @@ func GetChartPredictEdbInfoDataListByConfList(predictEdbConfList []*PredictEdbCo
 			predictEdbInfoData, tmpMinValue, tmpMaxValue = GetChartPredictEdbInfoDataListByRuleNLinearRegression(predictEdbConf.PredictEdbInfoId, nValue, startDate, dataEndTime, frequency, realPredictEdbInfoData, predictEdbInfoData, existMap)
 		case 9: //9:动态环差”预测规则;
 			predictEdbInfoData, tmpMinValue, tmpMaxValue = GetChartPredictEdbInfoDataListByRuleTrendsHC(predictEdbConf.PredictEdbInfoId, predictEdbConf.ConfigId, startDate, dataEndTime, frequency, realPredictEdbInfoData, predictEdbInfoData, existMap)
+		case 10: //10:根据 给定终值后插值 规则获取预测数据
+			tmpValDecimal, tmpErr := decimal.NewFromString(predictEdbConf.Value)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			finalValue, _ := tmpValDecimal.Float64()
+			predictEdbInfoData, tmpMinValue, tmpMaxValue = GetChartPredictEdbInfoDataListByRuleFinalValueHc(predictEdbConf.PredictEdbInfoId, finalValue, startDate, dataEndTime, frequency, realPredictEdbInfoData, predictEdbInfoData, existMap)
 		}
 		//startDate = dataEndTime.AddDate(0, 0, 1)
 		startDate = dataEndTime

+ 65 - 0
models/predict_edb_info_rule.go

@@ -638,3 +638,68 @@ func GetChartPredictEdbInfoDataListByRuleTrendsHC(edbInfoId, configId int, start
 	}
 	return
 }
+
+//	GetChartPredictEdbInfoDataListByRuleFinalValueHc 根据 给定终值后插值 规则获取预测数据
+// 项目背景:
+//假设螺纹产量在2023年1月1号的预测值是255万吨,从当下到2023年1月1号,螺纹产量将会线性变化,那么每一期的螺纹产量是多少?
+//算法:从当下(2022/10/28)到2023/1/1号,一共65天,从当前值(305.02)到255,差值-50.02,
+//则每日环差为-50.02/65=-0.7695。因为数据点是周度频率,每周环差为,-0.3849*7=-5.3868。
+//从以上计算过程可看出,“给定终值后差值”的算法,是在“环差”算法的基础上,做的一个改动。即这个”环差值”=【(终值-最新值)/终值与最新值得日期差】*数据频率
+//需求说明:
+//1、增加一个预测规则,名为“给定终值后插值”,给定预测截止日期和预测终值,计算最新数据日期至预测截止日期的时间差T,计算最新数据和预测终值的数据差S,数据频率与指标频度有关,日度=1,周度=7,旬度=10,月度=30,季度=90,年度=365,环差值=S/T*频率,预测数值=前一天数值+环差值;
+//2、最新数据值和日期改动后,需重新计算环差值和预测数值;
+func GetChartPredictEdbInfoDataListByRuleFinalValueHc(edbInfoId int, finalValue float64, startDate, endDate time.Time, frequency string, realPredictEdbInfoData, predictEdbInfoData []*EdbInfoSearchData, existMap map[string]float64) (newPredictEdbInfoData []*EdbInfoSearchData, minValue, maxValue float64) {
+	allDataList := make([]*EdbInfoSearchData, 0)
+	allDataList = append(allDataList, realPredictEdbInfoData...)
+	allDataList = append(allDataList, predictEdbInfoData...)
+	newPredictEdbInfoData = predictEdbInfoData
+
+	index := len(allDataList)
+	//获取后面的预测日期
+	dayList := getPredictEdbDayList(startDate, endDate, frequency)
+	lenDay := len(dayList)
+	if lenDay <= 0 {
+		return
+	}
+
+	var hcValue float64
+	finalValueDeciamal := decimal.NewFromFloat(finalValue)
+	dayDecimal := decimal.NewFromInt(int64(lenDay))
+	hcValue, _ = finalValueDeciamal.Div(dayDecimal).Float64()
+
+	//获取后面的预测数据
+	predictEdbInfoData = make([]*EdbInfoSearchData, 0)
+	lastK := lenDay - 1 // 最后的日期
+	for k, currentDate := range dayList {
+		tmpK := index + k - 1 //上1期的值
+
+		var val float64
+		// 环差别值计算
+		if k == lastK { //如果是最后一天,那么就用最终值,否则就计算
+			val = finalValue
+		} else {
+			val = PredictHczDiv(allDataList[tmpK].Value, hcValue)
+		}
+
+		currentDateStr := currentDate.Format(utils.FormatDate)
+		tmpData := &EdbInfoSearchData{
+			EdbDataId: edbInfoId + 10000000000 + index + k,
+			//EdbInfoId:     edbInfoId,
+			DataTime: currentDateStr,
+			Value:    val,
+			//DataTimestamp: (currentDate.UnixNano() / 1e6) + 1000, //前端需要让加1s,说是2022-09-01 00:00:00 这样的整点不合适
+		}
+		newPredictEdbInfoData = append(newPredictEdbInfoData, tmpData)
+		allDataList = append(allDataList, tmpData)
+		existMap[currentDateStr] = val
+
+		// 最大最小值
+		if val < minValue {
+			minValue = val
+		}
+		if val > maxValue {
+			maxValue = val
+		}
+	}
+	return
+}