Browse Source

季节性图显示bug

xyxie 1 month ago
parent
commit
a6a9f81034
3 changed files with 136 additions and 38 deletions
  1. 1 0
      models/chart_info.go
  2. 118 38
      services/chart_info_show.go
  3. 17 0
      utils/common.go

+ 1 - 0
models/chart_info.go

@@ -420,6 +420,7 @@ type ChartEdbInfoMapping struct {
 	ChartColor          string  `description:"颜色"`
 	PredictChartColor   string  `description:"预测数据的颜色"`
 	ChartWidth          float64 `description:"线条大小"`
+	ChartScale          float64 `description:"参考刻度线"`
 	ChartType           int     `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图"`
 	LatestDate          string  `description:"数据最新日期"`
 	LatestValue         float64 `description:"数据最新值"`

+ 118 - 38
services/chart_info_show.go

@@ -364,7 +364,16 @@ func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
 	// 指标对应的所有数据
 	edbDataListMap = make(map[int][]*models.EdbDataList)
-
+	// 设置季节性图的左右轴
+	seasonXStartDateWithYear := ""
+	seasonXEndDateWithYear := ""
+	// 如果是季节性图则进入特殊排序
+	if chartType == 2 {
+		// 根据设置的左右轴,对mappingList进行排序,1左轴排在前面,0右轴排在前面
+		sort.Slice(mappingList, func(i, j int) bool {
+			return mappingList[i].IsAxis > mappingList[j].IsAxis
+		})
+	}
 	for _, v := range mappingList {
 		//fmt.Println("v:", v.EdbInfoId)
 		item := new(models.ChartEdbInfoMapping)
@@ -398,6 +407,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 			item.ChartStyle = ""
 			item.ChartColor = ""
 			item.ChartWidth = 0
+			item.ChartScale = 0
 			item.MaxData = v.MaxValue
 			item.MinData = v.MinValue
 		} else {
@@ -411,6 +421,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 			item.ChartStyle = v.ChartStyle
 			item.ChartColor = v.ChartColor
 			item.ChartWidth = v.ChartWidth
+			item.ChartScale = v.ChartScale
 			item.IsOrder = v.IsOrder
 			item.MaxData = v.MaxData
 			item.MinData = v.MinData
@@ -437,7 +448,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		} else {
 			if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
 				var startTimeRealTemp time.Time
-				startDateParse, _ := time.Parse(utils.FormatDate, startDate)
+				startDateParse, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
 				switch v.LeadUnit {
 				case "天":
 					startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
@@ -458,8 +469,8 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 					diffSeconds = 0
 				}
 
-				// todo 预测指标的开始日期也要偏移
-				/*{
+				// 预测指标的开始日期也要偏移
+				{
 					day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
 					if tmpErr != nil {
 						err = tmpErr
@@ -471,7 +482,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 						return
 					}
 					item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
-				}*/
+				}
 			} else {
 				startDateReal = startDate
 			}
@@ -490,8 +501,6 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		dataList := make([]*models.EdbDataList, 0)
 		dataList, err = GetEdbDataList(v.EdbInfoId, v.EdbType, startDateReal, endDate)
 		if err != nil {
-			// 获取指标数据失败
-			err = fmt.Errorf("获取指标数据失败 GetEdbDataList error, %v", err)
 			return
 		}
 
@@ -532,7 +541,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		}
 
 		if chartType == 2 && item.IsAxis == 1 {
-			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
+			latestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
 			if tmpErr != nil {
 				//item.DataList = dataList
 				item.IsNullData = true
@@ -552,42 +561,87 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 						return
 					}
-					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
+					quarterDataList, seasonXStartDateWithYearTmp, seasonXEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
 					if tErr != nil {
 						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 						return
 					}
 					item.DataList = quarterDataList
+					seasonXStartDateWithYear = seasonXStartDateWithYearTmp
+					seasonXEndDateWithYear = seasonXEndDateWithYearTmp
 				}
 
 			} else {
-				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
+				quarterDataList, seasonXStartDateWithYearTmp, seasonXEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
 				if tErr != nil {
 					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 					return
 				}
 				item.DataList = quarterDataList
+				seasonXStartDateWithYear = seasonXStartDateWithYearTmp
+				seasonXEndDateWithYear = seasonXEndDateWithYearTmp
 			}
 
 		} else if chartType == 2 && item.IsAxis == 0 {
-			// 右轴数据处理,只要最新一年
-			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
-			if tmpErr != nil {
-				//item.DataList = dataList
-				item.IsNullData = true
-				edbList = append(edbList, item)
-				continue
-				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
-				return
-			}
+			// 右轴数据处理
+			// xStartDate := "01-01"
+
+			// jumpYear := 0
+			// var seasonExtra models.SeasonExtraItem
+			// if seasonExtraConfig != "" {
+			// 	err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
+			// 	if err != nil {
+			// 		return
+			// 	}
+			// }
+
+			// if seasonExtra.XStartDate != "" {
+			// 	xStartDate = seasonExtra.XStartDate
+			// 	jumpYear = seasonExtra.JumpYear
+			// }
+
+			// length := len(dataList)
+			// if length == 0 {
+			// 	return
+			// }
+			// latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
+			// if tmpErr != nil {
+			// 	//item.DataList = dataList
+			// 	item.IsNullData = true
+			// 	edbList = append(edbList, item)
+			// 	continue
+			// 	err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
+			// 	return
+			// }
+
+			// var rightAxisDate time.Time
+			// if jumpYear == 1 {
+			// 	latestDate = latestDate.AddDate(-1, 0, 0)
+			// }
+			// latestDateStr := fmt.Sprintf("%d-%s", latestDate.Year(), xStartDate)
+			// rightAxisDate, err = time.Parse(utils.FormatDate, latestDateStr)
+			// if err != nil {
+			// 	return
+			// }
+			// nowYear := time.Now().Year()
 			newDataList := make([]*models.EdbDataList, 0)
+			seasonXStartDateWithYearT, _ := time.ParseInLocation(utils.FormatDate, seasonXStartDateWithYear, time.Local)
+			seasonXEndDateWithYearT, _ := time.ParseInLocation(utils.FormatDate, seasonXEndDateWithYear, time.Local)
 			for _, v := range dataList {
-				dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
+				dataTime, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
 				if e != nil {
 					err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
 					return
 				}
-				if dataTime.Year() == latestDate.Year() {
+				//dataTimeT, _ := time.Parse(utils.FormatDate, v.DataTime)
+				// year := dataTimeT.Year()
+				// newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+				// v.DataTimestamp = newItemDate.UnixNano() / 1e6
+				// if dataTime.Equal(rightAxisDate) || dataTime.After(rightAxisDate) {
+				// 	newDataList = append(newDataList, v)
+				// }
+				// 如果数据时间在横轴的开始日期和结束日期之间,则加入到数据列表中
+				if (dataTime.After(seasonXStartDateWithYearT) && dataTime.Before(seasonXEndDateWithYearT)) || dataTime.Equal(seasonXStartDateWithYearT) || dataTime.Equal(seasonXEndDateWithYearT) {
 					newDataList = append(newDataList, v)
 				}
 			}
@@ -604,7 +658,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 }
 
 // GetSeasonEdbInfoDataListByXDate 季节性图的指标数据根据横轴展示
-func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, xStartDateWithYear string, xEndDateWithYear string, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -640,7 +694,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 	//根据数据确定最早的年份,和最近年份
 	//根据横轴的日期,汇总所有的年份
 	startDate := dataList[0].DataTime
-	startDateT, tmpErr := time.Parse(utils.FormatDate, startDate)
+	startDateT, tmpErr := time.ParseInLocation(utils.FormatDate, startDate,time.Local)
 	if tmpErr != nil {
 		err = tmpErr
 		return
@@ -648,13 +702,14 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 	startYear := startDateT.Year()
 	//获取数据的最新日期
 	lastDate := dataList[length-1].DataTime
-	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
+	lastDateT, tmpErr := time.ParseInLocation(utils.FormatDate, lastDate,time.Local)
 	if tmpErr != nil {
 		err = tmpErr
 		return
 	}
 	endYear := lastDateT.Year()
-	nowYear := time.Now().Year()
+	nowYear := endYear
+	chartLegendMaxYear := 0
 	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
 	quarterDataList := make([]*models.QuarterData, 0)
@@ -673,13 +728,13 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 		name := fmt.Sprintf("%s_%s", startStr, endStr)
 		showName := fmt.Sprintf("%d_%d", currentStartYear, currentEndYear)
 
-		startT, tEr := time.Parse(utils.FormatDate, startStr)
+		startT, tEr := time.ParseInLocation(utils.FormatDate, startStr,time.Local)
 		if tEr != nil {
 			err = tEr
 			return
 		}
 
-		endT, tEr := time.Parse(utils.FormatDate, endStr)
+		endT, tEr := time.ParseInLocation(utils.FormatDate, endStr,time.Local)
 		if tEr != nil {
 			err = tEr
 			return
@@ -700,25 +755,32 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 			EndDate:   endT,
 			ShowName:  showName,
 		}
+		chartLegendMaxYear = endT.Year()
 		dataMap[name] = item
 		chartLegendMap[name] = idx
 		idx++
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
+		xStartDateWithYear = startStr
+		xEndDateWithYear = endStr
 		if lastDateT.Before(endT) {
 			//如果最新的日期在起始日之前,则跳出循环
 			break
 		}
 	}
 	lenYear := len(dataMap)
+	if chartLegendMaxYear > endYear {
+		chartLegendMaxYear = endYear
+	}
 	for k, v := range dataMap {
 		if i, ok := chartLegendMap[k]; ok {
-			v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+			//v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+			v.ChartLegend = strconv.Itoa(chartLegendMaxYear - lenYear + i)
 		}
 		dataMap[k] = v
 	}
 
 	for _, v := range dataList {
-		dataTimeT, _ := time.Parse(utils.FormatDate, v.DataTime)
+		dataTimeT, _ := time.ParseInLocation(utils.FormatDate, v.DataTime,time.Local)
 		year := dataTimeT.Year()
 		newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
 		for k, dateItem := range dataMap {
@@ -733,7 +795,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 				if jumpYear == 1 {
 					//计算前一年最大的日期, 只补齐数据到去年
 					beforeYearMaxDate := fmt.Sprintf("%d-12-31", dateItem.StartDate.Year())
-					beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+					beforeYearMaxDateT, _ := time.ParseInLocation(utils.FormatDate, beforeYearMaxDate,time.Local)
 					if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
 						newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
 					} else {
@@ -763,6 +825,9 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 	}
 	for k, v := range dataMap {
 		itemList := quarterMap[k]
+		/*if len(itemList) == 0 {
+			continue
+		}*/
 		quarterItem := new(models.QuarterData)
 		quarterItem.Years = v.ShowName
 		quarterItem.ChartLegend = v.ChartLegend
@@ -792,7 +857,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 }
 
 // GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
-func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, xStartDateWithYear string, xEndDateWithYear string, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -838,13 +903,14 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate
 	//获取数据的最新日期
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
 	maxY := result.List[length-1].Year
-	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
+	lastDateT, tmpErr := time.ParseInLocation(utils.FormatDate, lastDate,time.Local)
 	if tmpErr != nil {
 		err = tmpErr
 		return
 	}
 	endYear := lastDateT.Year()
-	nowYear := time.Now().Year()
+	nowYear := endYear
+	chartLegendMaxYear := 0
 	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
 	quarterDataList := make([]*models.QuarterData, 0)
@@ -864,13 +930,13 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate
 		endStr := fmt.Sprintf("%d-%s", currentEndYear, xEndDate)
 		showName := fmt.Sprintf("%d_%d", currentStartYear, currentEndYear)
 
-		startT, tEr := time.Parse(utils.FormatDate, startStr)
+		startT, tEr := time.ParseInLocation(utils.FormatDate, startStr,time.Local)
 		if tEr != nil {
 			err = tEr
 			return
 		}
 
-		endT, tEr := time.Parse(utils.FormatDate, endStr)
+		endT, tEr := time.ParseInLocation(utils.FormatDate, endStr,time.Local)
 		if tEr != nil {
 			err = tEr
 			return
@@ -889,21 +955,28 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate
 			EndDate:   endT,
 			ShowName:  showName,
 		}
+		chartLegendMaxYear = endT.Year()
 		dataMap[showName] = item
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
 		startTmpT = startT
 		endTmpT = endT
 		chartLegendMap[showName] = idx
 		idx++
+		xStartDateWithYear = startStr
+		xEndDateWithYear = endStr
 		if lastDateT.Before(endT) {
 			//如果最新的日期在起始日之前,则跳出循环
 			break
 		}
 	}
 	lenYear := len(dataMap)
+	if chartLegendMaxYear > endYear {
+		chartLegendMaxYear = endYear
+	}
 	for k, v := range dataMap {
 		if i, ok := chartLegendMap[k]; ok {
-			v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+			//v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+			v.ChartLegend = strconv.Itoa(chartLegendMaxYear - lenYear + i)
 		}
 		dataMap[k] = v
 	}
@@ -956,7 +1029,11 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate
 				DataTimestamp: item.DataTimestamp,
 				Value:         item.Value,
 			}
-			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
+			dataTimeT, _ := time.ParseInLocation(utils.FormatDate, item.DataTime,time.Local)
+			// year := dataTimeT.Year()
+			// newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+			// timestamp := newItemDate.UnixNano() / 1e6
+			// tmpVal.DataTimestamp = timestamp
 			if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
 				tmpV := &tmpVal
 				if findVal, ok := quarterMap[name]; !ok {
@@ -980,6 +1057,9 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data.EdbDataResult, latestDate
 
 	for k, v := range dataMap {
 		itemList := quarterMap[k]
+		/*if len(itemList) == 0 {
+			continue
+		}*/
 		quarterItem := new(models.QuarterData)
 		quarterItem.Years = v.ShowName
 		quarterItem.ChartLegend = v.ChartLegend

+ 17 - 0
utils/common.go

@@ -1302,3 +1302,20 @@ func (ms MapSorter) Less(i, j int) bool {
 func (ms MapSorter) Swap(i, j int) {
 	ms[i], ms[j] = ms[j], ms[i]
 }
+
+
+// GetDaysBetween2Date 计算两个日期之间相差几天
+func GetDaysBetween2Date(format, date1Str, date2Str string) (int, error) {
+	// 将字符串转化为Time格式
+	date1, err := time.ParseInLocation(format, date1Str, time.Local)
+	if err != nil {
+		return 0, err
+	}
+	// 将字符串转化为Time格式
+	date2, err := time.ParseInLocation(format, date2Str, time.Local)
+	if err != nil {
+		return 0, err
+	}
+	//计算相差天数
+	return int(date1.Sub(date2).Hours() / 24), nil
+}