xyxie 1 год назад
Родитель
Сommit
ec36513784
1 измененных файлов с 129 добавлено и 57 удалено
  1. 129 57
      services/data/chart_info.go

+ 129 - 57
services/data/chart_info.go

@@ -284,7 +284,11 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		}
 
 		if chartType == 2 {
-			latestDateStr := v.LatestDate //实际数据的截止日期
+			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
+			if tmpErr != nil {
+				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
+				return
+			}
 			if calendar == "农历" {
 				if len(dataList) <= 0 {
 					result := new(models.EdbDataResult)
@@ -296,7 +300,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 						return
 					}
 
-					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, seasonExtraConfig, calendarPreYear)
+					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
 					if tErr != nil {
 						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 						return
@@ -305,7 +309,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 				}
 
 			} else {
-				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, seasonExtraConfig)
+				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
 				if tErr != nil {
 					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 					return
@@ -324,7 +328,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 }
 
 // GetSeasonEdbInfoDataListByXDate 季节性图的指标数据根据横轴展示
-func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateStr string, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -348,12 +352,14 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 	if length == 0 {
 		return
 	}
-	legendMap := make(map[string]string)
+	legendMap := make(map[string]string, 0)
 	if len(legends) > 0 {
 		for _, v := range legends {
 			legendMap[v.Name] = v.Value
 		}
 	}
+	latestDateStr := latestDate.Format(utils.FormatDate)
+
 	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
 	//根据数据确定最早的年份,和最近年份
 	//根据横轴的日期,汇总所有的年份
@@ -364,9 +370,6 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		return
 	}
 	startYear := startDateT.Year()
-	if jumpYear == 1 {
-		startYear = startYear - 1
-	}
 	//获取数据的最新日期
 	lastDate := dataList[length-1].DataTime
 	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
@@ -375,10 +378,11 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		return
 	}
 	endYear := lastDateT.Year()
-	dataMap := make(map[string]models.QuarterXDateItem)
+	nowYear := time.Now().Year()
+	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
 	quarterDataList := make([]*models.QuarterData, 0)
-	quarterMap := make(map[string][]*models.EdbDataList)
+	quarterMap := make(map[string][]*models.EdbDataList, 0)
 
 	//整理出日期
 	leftNameFlag := true
@@ -408,12 +412,15 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 			//如果最新的日期在起始日之前,则跳出循环
 			break
 		}
-
 		if startT.Before(lastDateT) && endT.After(lastDateT) {
 			if endYear > currentStartYear {
 				leftNameFlag = false
 			}
 		}
+		if endT.Year() > nowYear {
+			//如果最新的日期比真实年份要大,则数据全部按照最大的年份补齐
+			nowYear = endT.Year()
+		}
 		item := models.QuarterXDateItem{
 			StartDate: startT,
 			EndDate:   endT,
@@ -421,7 +428,6 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		}
 		dataMap[name] = item
 	}
-
 	for k, v := range dataMap {
 		if leftNameFlag {
 			v.ChartLegend = strconv.Itoa(v.StartDate.Year())
@@ -431,12 +437,18 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		dataMap[k] = v
 	}
 
-	nowYear := time.Now().Year()
 	for _, v := range dataList {
 		dataTimeT, _ := time.Parse(utils.FormatDate, v.DataTime)
 		year := dataTimeT.Year()
 		newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
 		for k, dateItem := range dataMap {
+			tmpVal := models.EdbDataList{
+				EdbDataId:     v.EdbDataId,
+				EdbInfoId:     v.EdbInfoId,
+				DataTime:      v.DataTime,
+				DataTimestamp: v.DataTimestamp,
+				Value:         v.Value,
+			}
 			if (dateItem.StartDate.Before(dataTimeT) && dateItem.EndDate.After(dataTimeT)) || dateItem.StartDate == dataTimeT || dateItem.EndDate == dataTimeT {
 				if jumpYear == 1 {
 					//计算前一年最大的日期, 只补齐数据到去年
@@ -444,27 +456,31 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 					beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
 					if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
 						newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
+					} else {
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
 					}
+				} else {
+					newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
 				}
 				timestamp := newItemDate.UnixNano() / 1e6
-				v.DataTimestamp = timestamp
+				tmpVal.DataTimestamp = timestamp
+				tmpV := &tmpVal
 				if findVal, ok := quarterMap[k]; !ok {
-					findVal = append(findVal, v)
+					findVal = append(findVal, tmpV)
 					quarterMap[k] = findVal
 				} else {
-					findVal = append(findVal, v)
+					findVal = append(findVal, tmpV)
 					quarterMap[k] = findVal
 				}
 
 				if v.DataTime == latestDateStr {
-					dateItem.CuttingDataTimestamp = v.DataTimestamp
+					dateItem.CuttingDataTimestamp = timestamp
 					dataMap[k] = dateItem
 				}
-				break
+				//break
 			}
 		}
 	}
-	latestDate, _ := time.Parse(utils.FormatDate, latestDateStr)
 	for k, v := range dataMap {
 		itemList := quarterMap[k]
 		quarterItem := new(models.QuarterData)
@@ -473,7 +489,6 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		if le, ok := legendMap[v.ShowName]; ok {
 			quarterItem.ChartLegend = le
 		}
-		quarterItem.Year = quarterItem.ChartLegend
 		quarterItem.DataList = itemList
 		quarterItem.CuttingDataTimestamp = v.CuttingDataTimestamp
 
@@ -487,7 +502,6 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 		quarterDataList = append(quarterDataList, quarterItem)
 	}
 
-	// todo 处理图例名称
 	if len(quarterDataList) > 0 {
 		quarterDataListSort = quarterDataList
 		sort.Sort(quarterDataListSort)
@@ -496,7 +510,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDateS
 }
 
 // GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
-func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDateStr string, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -520,21 +534,22 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 	if length == 0 {
 		return
 	}
-	legendMap := make(map[string]string)
+	legendMap := make(map[string]string, 0)
 	if len(legends) > 0 {
 		for _, v := range legends {
 			legendMap[v.Name] = v.Value
 		}
 	}
+	latestDateYear := latestDate.Year()
 	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
 	//根据数据确定最早的年份,和最近年份
 	//根据横轴的日期,汇总所有的年份
 	startYear := result.List[0].Year
-	if jumpYear == 1 {
+	/*if jumpYear == 1 {
 		if startYear != calendarPreYear {
 			startYear = startYear - 1
 		}
-	}
+	}*/
 	itemLength := len(result.List[length-1].Items)
 	//获取数据的最新日期
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
@@ -544,11 +559,13 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 		return
 	}
 	endYear := lastDateT.Year()
-	dataMap := make(map[string]models.QuarterXDateItem)
+	nowYear := time.Now().Year()
+	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
 	quarterDataList := make([]*models.QuarterData, 0)
 	resultData := make([]*models.QuarterData, 0)
-	quarterMap := make(map[string][]*models.EdbDataList)
+	quarterMap := make(map[string][]*models.EdbDataList, 0)
+
 	//整理出日期
 	leftNameFlag := true
 	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
@@ -576,12 +593,15 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 			//如果最新的日期在起始日之前,则跳出循环
 			break
 		}
-
-		if (startT.Before(lastDateT) && endT.After(lastDateT)) || startT == lastDateT || endT == lastDateT {
+		if startT.Before(lastDateT) && endT.After(lastDateT) {
 			if endYear > currentStartYear {
 				leftNameFlag = false
 			}
 		}
+		if endT.Year() > nowYear {
+			//如果最新的日期比真实年份要大,则数据全部按照最大的年份补齐
+			nowYear = endT.Year()
+		}
 		item := models.QuarterXDateItem{
 			StartDate: startT,
 			EndDate:   endT,
@@ -598,7 +618,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 		dataMap[k] = v
 	}
 
-	yearDataListMap := make(map[int]*models.EdbDataItems)
+	yearDataListMap := make(map[int]*models.EdbDataItems, 0)
 
 	for _, lv := range result.List {
 		yearDataListMap[lv.Year] = lv
@@ -625,33 +645,93 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 
 	for name, dateItem := range dataMap {
 		lv, ok1 := yearDataListMap[dateItem.EndDate.Year()]
+		if dateItem.EndDate.Year() > maxY {
+			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
+		}
 		if !ok1 {
-			break
+			continue
 		}
-
 		for _, item := range lv.Items {
+			tmpVal := models.EdbDataList{
+				EdbDataId:     item.EdbDataId,
+				EdbInfoId:     item.EdbInfoId,
+				DataTime:      item.DataTime,
+				DataTimestamp: item.DataTimestamp,
+				Value:         item.Value,
+			}
 			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
-			//查出当前年份里最大的数据的年份,和第二大的年份
-			if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
-				if findVal, ok := quarterMap[name]; !ok {
-					findVal = append(findVal, item)
-					quarterMap[name] = findVal
-				} else {
-					findVal = append(findVal, item)
-					quarterMap[name] = findVal
+			year := dataTimeT.Year()
+			newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+			if dateItem.EndDate.Year() > maxY {
+				if (dateItem.StartDate.Before(dataTimeT) && dateItem.EndDate.After(dataTimeT)) || dateItem.StartDate == dataTimeT || dateItem.EndDate == dataTimeT {
+					if jumpYear == 1 {
+						//计算前一年最大的日期, 只补齐数据到去年
+						beforeYearMaxDate := fmt.Sprintf("%d-12-31", dateItem.StartDate.Year())
+						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
+							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
+						} else {
+							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+						}
+					} else {
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+					}
+					timestamp := newItemDate.UnixNano() / 1e6
+					tmpVal.DataTimestamp = timestamp
+					tmpV := &tmpVal
+					if findVal, ok := quarterMap[name]; !ok {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					} else {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					}
+					if lv.Year >= latestDateYear {
+						// 切割的日期时间字符串
+						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
+						if item.DataTime == cuttingDataTimeStr {
+							dateItem.CuttingDataTimestamp = timestamp
+							dataMap[name] = dateItem
+						}
+					}
 				}
-				// todo 统计截止日
-				if lv.Year == endYear && item.DataTime == latestDateStr {
-					if dv, ok1 := dataMap[name]; ok1 {
-						dv.CuttingDataTimestamp = item.DataTimestamp
-						dataMap[name] = dv
+			} else {
+				if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
+					if jumpYear == 1 {
+						//计算前一年最大的日期, 只补齐数据到去年
+						beforeYearMaxDate := fmt.Sprintf("%d-12-31", startTmpT.Year())
+						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
+							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
+						} else {
+							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+						}
+					} else {
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+					}
+					timestamp := newItemDate.UnixNano() / 1e6
+					tmpVal.DataTimestamp = timestamp
+					tmpV := &tmpVal
+					if findVal, ok := quarterMap[name]; !ok {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					} else {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					}
+					if lv.Year >= latestDateYear {
+						// 切割的日期时间字符串
+						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
+						if item.DataTime == cuttingDataTimeStr {
+							dateItem.CuttingDataTimestamp = timestamp
+							dataMap[name] = dateItem
+						}
 					}
 				}
 			}
 		}
-	}
 
-	latestDate, _ := time.Parse(utils.FormatDate, latestDateStr)
+	}
 	for k, v := range dataMap {
 		itemList := quarterMap[k]
 		quarterItem := new(models.QuarterData)
@@ -660,24 +740,16 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 		if le, ok := legendMap[v.ShowName]; ok {
 			quarterItem.ChartLegend = le
 		}
-		quarterItem.Year = quarterItem.ChartLegend
 		quarterItem.DataList = itemList
 		quarterItem.CuttingDataTimestamp = v.CuttingDataTimestamp
 
-		//如果等于最后的实际日期,那么将切割时间戳记录
-		if quarterItem.CuttingDataTimestamp == 0 {
-			//如果大于最后的实际日期,那么第一个点就是切割的时间戳
-			if latestDate.Before(v.StartDate) && len(itemList) > 0 {
-				quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
-			}
-		}
 		quarterDataList = append(quarterDataList, quarterItem)
 	}
 
-	if result.List[0].Year != calendarPreYear || jumpYear == 1 {
+	if result.List[0].Year != calendarPreYear {
 		itemList := make([]*models.EdbDataList, 0)
 		items := new(models.QuarterData)
-		//items.Year = calendarPreYear
+		//items.Year = calendarPreYear
 		items.DataList = itemList
 
 		newResult := make([]*models.QuarterData, 0)