Browse Source

预测指标的季节性图表回撤逻辑

xyxie 1 year ago
parent
commit
931aa687dc
1 changed files with 85 additions and 9 deletions
  1. 85 9
      services/data/predict_edb_info.go

+ 85 - 9
services/data/predict_edb_info.go

@@ -1009,6 +1009,13 @@ func GetChartDataList(dataList []*data_manage.EdbDataList, chartType int, calend
 		newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
 		startDateReal = newStartDateReal.Format(utils.FormatDate)
 	}
+	//实际数据的截止日期
+	latestDate, tmpErr := time.Parse(utils.FormatDate, latestDateStr)
+	if tmpErr != nil {
+		err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + latestDateStr))
+		return
+	}
+	latestDateYear := latestDate.Year() //实际数据截止年份
 
 	// 曲线图
 	if chartType == 1 {
@@ -1025,20 +1032,89 @@ func GetChartDataList(dataList []*data_manage.EdbDataList, chartType int, calend
 				err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 				return
 			}
+			// 处理季节图的截止日期
+			for k, edbDataItems := range result.List {
+				var cuttingDataTimestamp int64
+
+				// 切割的日期时间字符串
+				cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
+				//如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
+				if edbDataItems.Year >= latestDateYear {
+					for _, tmpData := range edbDataItems.Items {
+						if tmpData.DataTime == cuttingDataTimeStr {
+							cuttingDataTimestamp = tmpData.DataTimestamp
+							break
+						}
+					}
+				}
+				edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
+				result.List[k] = edbDataItems
+			}
 
-			quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, "", calendarPreYear)
-			if tErr != nil {
-				err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
-				return
+			if result.List[0].Year != calendarPreYear {
+				itemList := make([]*data_manage.EdbDataList, 0)
+				items := new(data_manage.EdbDataItems)
+				//items.Year = calendarPreYear
+				items.Items = itemList
+
+				newResult := new(data_manage.EdbDataResult)
+				newResult.List = append(newResult.List, items)
+				newResult.List = append(newResult.List, result.List...)
+				resultDataList = newResult
+			} else {
+				resultDataList = result
 			}
-			resultDataList = quarterDataList
 		}
 
 	} else {
-		quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, "")
-		if tErr != nil {
-			err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
-			return
+		currentYear := time.Now().Year()
+
+		quarterDataList := make([]*data_manage.QuarterData, 0)
+		quarterMap := make(map[int][]*data_manage.EdbDataList)
+		var quarterArr []int
+
+		for _, v := range dataList {
+			itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
+			if tmpErr != nil {
+				err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
+				return
+			}
+			year := itemDate.Year()
+			newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
+			timestamp := newItemDate.UnixNano() / 1e6
+			v.DataTimestamp = timestamp
+			if findVal, ok := quarterMap[year]; !ok {
+				quarterArr = append(quarterArr, year)
+				findVal = append(findVal, v)
+				quarterMap[year] = findVal
+			} else {
+				findVal = append(findVal, v)
+				quarterMap[year] = findVal
+			}
+		}
+		for _, v := range quarterArr {
+			itemList := quarterMap[v]
+			quarterItem := new(data_manage.QuarterData)
+			quarterItem.Year = v
+			quarterItem.DataList = itemList
+
+			//如果等于最后的实际日期,那么将切割时间戳记录
+			if v == latestDateYear {
+				var cuttingDataTimestamp int64
+				for _, tmpData := range itemList {
+					if tmpData.DataTime == latestDateStr {
+						cuttingDataTimestamp = tmpData.DataTimestamp
+						break
+					}
+				}
+				quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
+			} else if v > latestDateYear {
+				//如果大于最后的实际日期,那么第一个点就是切割的时间戳
+				if len(itemList) > 0 {
+					quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
+				}
+			}
+			quarterDataList = append(quarterDataList, quarterItem)
 		}
 		resultDataList = quarterDataList
 	}