|
@@ -1615,8 +1615,12 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
|
|
|
|
|
|
yearValueConfig := annualValueInversionConf.Value
|
|
|
|
|
|
+
|
|
|
+ currDayTime, err := time.ParseInLocation(utils.FormatDate, allDataList[index-1].DataTime, time.Local)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- currDayTime := dayList[0]
|
|
|
lastDayTime := dayList[len(dayList)-1]
|
|
|
if currDayTime.Year() != lastDayTime.Year() {
|
|
|
err = errors.New("年度值倒推不支持跨年预测")
|
|
@@ -1625,21 +1629,75 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
|
|
|
|
|
|
|
|
|
if annualValueInversionConf.Type == 1 {
|
|
|
+
|
|
|
|
|
|
currYearN := 0
|
|
|
+
|
|
|
var currYearVal float64
|
|
|
- for _, v := range allDataList {
|
|
|
- currTime, tmpErr := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if currTime.Year() != currDayTime.Year() {
|
|
|
- continue
|
|
|
+
|
|
|
+
|
|
|
+ {
|
|
|
+ if frequency != "周度" {
|
|
|
+ for _, v := range allDataList {
|
|
|
+ currTime, tmpErr := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if currTime.Year() != currDayTime.Year() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ currYearN++
|
|
|
+ currYearVal = currYearVal + v.Value
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ tmpDataList := make([]*models.EdbDataList, 0)
|
|
|
+
|
|
|
+ var lastData *models.EdbDataList
|
|
|
+
|
|
|
+ isFirst := true
|
|
|
+ for _, v := range allDataList {
|
|
|
+ currTime, tmpErr := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if currTime.Year() != currDayTime.Year() {
|
|
|
+ lastData = v
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if isFirst {
|
|
|
+ tmpDataList = append(tmpDataList, lastData)
|
|
|
+ }
|
|
|
+ isFirst = false
|
|
|
+ tmpDataList = append(tmpDataList, v)
|
|
|
+ currYearN++
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ tmpHandleDataMap := make(map[string]float64)
|
|
|
+ err = HandleDataByLinearRegression(tmpDataList, tmpHandleDataMap)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for tmpDate, val := range tmpHandleDataMap {
|
|
|
+ tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if tmpDateTime.Year() != currDayTime.Year() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ currYearVal = currYearVal + val
|
|
|
+ }
|
|
|
+
|
|
|
+ currYearVal = currYearVal / 7
|
|
|
}
|
|
|
- currYearN++
|
|
|
- currYearVal = currYearVal + v.Value
|
|
|
}
|
|
|
|
|
|
var averageVal float64
|
|
@@ -1663,8 +1721,11 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
|
|
|
yearLastDay := time.Date(currDayTime.Year(), 12, 31, 0, 0, 0, 0, time.Local)
|
|
|
subDay2 := utils.GetTimeSubDay(yearFirstDay, yearLastDay) + 1
|
|
|
|
|
|
+
|
|
|
surplusN := decimal.NewFromInt(int64(subDay2 - subDay)).Div(decimal.NewFromInt(int64(subDay))).Mul(decimal.NewFromInt(int64(currYearN)))
|
|
|
- averageVal, _ = (decimal.NewFromFloat(annualValueInversionConf.Value).Sub(decimal.NewFromFloat(currYearVal))).Div(surplusN).Round(4).Float64()
|
|
|
+
|
|
|
+ balance := decimal.NewFromFloat(annualValueInversionConf.Value).Sub(decimal.NewFromFloat(currYearVal))
|
|
|
+ averageVal, _ = balance.Div(surplusN).Round(4).Float64()
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1719,32 +1780,48 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
|
|
|
|
|
|
for k, currentDate := range dayList {
|
|
|
currYearBalance := yearValueConfig - yearTotalMap[currentDate.Year()]
|
|
|
+
|
|
|
+
|
|
|
+ prevDateStr := allDataList[len(allDataList)-1].DataTime
|
|
|
+ prevDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, prevDateStr, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
lastYear := annualValueInversionConf.Year + (currentDate.Year() - currDayTime.Year())
|
|
|
|
|
|
- var lastDateTime time.Time
|
|
|
+
|
|
|
+ var lastPrevDateTime, lastDateTime time.Time
|
|
|
|
|
|
switch frequency {
|
|
|
case "半年度", "季度":
|
|
|
lastDateTime = time.Date(lastYear, currentDate.Month(), currentDate.Day(), 0, 0, 0, 0, currentDate.Location())
|
|
|
+ lastPrevDateTime = time.Date(lastYear, prevDateTime.Month(), prevDateTime.Day(), 0, 0, 0, 0, prevDateTime.Location())
|
|
|
case "月度":
|
|
|
lastDateTime = time.Date(lastYear, currentDate.Month()+1, 1, 0, 0, 0, 0, currentDate.Location()).AddDate(0, 0, -1)
|
|
|
+ lastPrevDateTime = time.Date(lastYear, prevDateTime.Month()+1, 1, 0, 0, 0, 0, prevDateTime.Location()).AddDate(0, 0, -1)
|
|
|
case "旬度":
|
|
|
- if currentDate.Day() == 10 || currentDate.Day() == 20 {
|
|
|
+ if prevDateTime.Day() == 10 || prevDateTime.Day() == 20 {
|
|
|
lastDateTime = time.Date(lastYear, currentDate.Month(), currentDate.Day(), 0, 0, 0, 0, currentDate.Location())
|
|
|
+ lastPrevDateTime = time.Date(lastYear, prevDateTime.Month(), prevDateTime.Day(), 0, 0, 0, 0, prevDateTime.Location())
|
|
|
} else {
|
|
|
lastDateTime = time.Date(lastYear, currentDate.Month()+1, 1, 0, 0, 0, 0, currentDate.Location()).AddDate(0, 0, -1)
|
|
|
+ lastPrevDateTime = time.Date(lastYear, prevDateTime.Month()+1, 1, 0, 0, 0, 0, prevDateTime.Location()).AddDate(0, 0, -1)
|
|
|
}
|
|
|
case "周度", "日度":
|
|
|
lastDateTime = time.Date(lastYear, currentDate.Month(), currentDate.Day(), 0, 0, 0, 0, currentDate.Location())
|
|
|
+ lastPrevDateTime = time.Date(lastYear, prevDateTime.Month(), prevDateTime.Day(), 0, 0, 0, 0, prevDateTime.Location())
|
|
|
}
|
|
|
|
|
|
|
|
|
var dateTotal float64
|
|
|
- dateTotal, ok := dateTotalMap[lastDateTime]
|
|
|
+
|
|
|
+ dateTotal, ok := dateTotalMap[lastPrevDateTime]
|
|
|
if !ok {
|
|
|
- yearFirstDayTime := time.Date(lastDateTime.Year(), 1, 1, 0, 0, 0, 0, lastDateTime.Location())
|
|
|
- for tmpDateTime := lastDateTime.AddDate(0, 0, -1); tmpDateTime.After(yearFirstDayTime) || tmpDateTime.Equal(yearFirstDayTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
|
|
|
+ yearFirstDayTime := time.Date(lastPrevDateTime.Year(), 1, 1, 0, 0, 0, 0, lastDateTime.Location())
|
|
|
+ for tmpDateTime := lastPrevDateTime.AddDate(0, 0, -1); tmpDateTime.After(yearFirstDayTime) || tmpDateTime.Equal(yearFirstDayTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
|
|
|
dateTotal, ok = dateTotalMap[tmpDateTime]
|
|
|
if ok {
|
|
|
break
|
|
@@ -1752,10 +1829,10 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- lastYearDateBalance := yearValueConfig - dateTotal
|
|
|
+
|
|
|
+ lastYearDateBalance := yearTotalMap[lastPrevDateTime.Year()] - dateTotal
|
|
|
|
|
|
-
|
|
|
+
|
|
|
tbVal := decimal.NewFromFloat(currYearBalance).Div(decimal.NewFromFloat(lastYearDateBalance))
|
|
|
|
|
|
|