|
@@ -3,6 +3,7 @@ package data
|
|
|
import (
|
|
|
"github.com/shopspring/decimal"
|
|
|
"hongze/hongze_chart_lib/models"
|
|
|
+ "hongze/hongze_chart_lib/models/data_manage"
|
|
|
"hongze/hongze_chart_lib/utils"
|
|
|
"time"
|
|
|
)
|
|
@@ -581,3 +582,75 @@ func getLinearResult(s []Coordinate) (gradient, intercept float64) {
|
|
|
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// GetChartPredictEdbInfoDataListByRuleTrendsHC 根据动态环比增加值的计算规则获取预测数据
|
|
|
+// 研究员有对预测指标进行动态环差计算的需求,即预测指标使用环差规则进行预测时,环比增加值不是固定值,而是由几个预测指标计算得出的动态变化的值;
|
|
|
+//需求说明:
|
|
|
+//1、增加“动态环差”预测规则;
|
|
|
+//2、环比增加值在弹窗设置;
|
|
|
+//3、动态环差预测举例:
|
|
|
+//指标A实际最新数据为2022-10-27(100);
|
|
|
+//预测指标B预测数据为2022-10-28(240)、2022-10-29(300);
|
|
|
+//预测指标C预测数据为2022-10-28(260)、2022-10-29(310);
|
|
|
+//计算公式为B-C;
|
|
|
+//则指标A至2022-10-29的预测值为2022-10-28(100+(240-260)=80)、2022-10-29(80+(300-310)=90);
|
|
|
+//注:动态环比增加值的计算遵从计算指标的计算规则,即用于计算的指标若有部分指标缺少部分日期数据,则这部分日期数据不做计算,为空;若动态环比增加值某一天为空,则往前追溯最近一期有值的环比增加值作为该天的数值参与计算;
|
|
|
+func GetChartPredictEdbInfoDataListByRuleTrendsHC(edbInfoId, configId int, startDate, endDate time.Time, frequency string, realPredictEdbInfoData, predictEdbInfoData []*models.EdbDataList, existMap map[string]float64) (newPredictEdbInfoData []*models.EdbDataList, minValue, maxValue float64) {
|
|
|
+ allDataList := make([]*models.EdbDataList, 0)
|
|
|
+ allDataList = append(allDataList, realPredictEdbInfoData...)
|
|
|
+ allDataList = append(allDataList, predictEdbInfoData...)
|
|
|
+ newPredictEdbInfoData = predictEdbInfoData
|
|
|
+
|
|
|
+ lenAllData := len(allDataList)
|
|
|
+ if lenAllData <= 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ hcDataMap := make(map[string]float64) //规则计算的环差值map
|
|
|
+
|
|
|
+ //已经生成的动态数据
|
|
|
+ tmpPredictEdbRuleDataList, err := data_manage.GetPredictEdbRuleDataList(edbInfoId, configId, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range tmpPredictEdbRuleDataList {
|
|
|
+ hcDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ dayList := getPredictEdbDayList(startDate, endDate, frequency)
|
|
|
+ for k, currentDate := range dayList {
|
|
|
+ // 最近一条数据
|
|
|
+ tmpLenAllDataList := len(allDataList)
|
|
|
+ lastValue := allDataList[tmpLenAllDataList-1].Value
|
|
|
+
|
|
|
+ // 动态环差值数据
|
|
|
+ currentDateStr := currentDate.Format(utils.FormatDate)
|
|
|
+ hcVal, ok := hcDataMap[currentDateStr]
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ lastValueDecimal := decimal.NewFromFloat(lastValue)
|
|
|
+ hcValDecimal := decimal.NewFromFloat(hcVal)
|
|
|
+
|
|
|
+ val, _ := lastValueDecimal.Add(hcValDecimal).RoundCeil(4).Float64()
|
|
|
+
|
|
|
+ tmpData := &models.EdbDataList{
|
|
|
+ EdbDataId: edbInfoId + 10000000000 + lenAllData + 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
|
|
|
+}
|