فهرست منبع

季节性图表横轴变更

xyxie 1 سال پیش
والد
کامیت
ecc1cbf259

+ 177 - 232
controllers/data_manage/chart_info.go

@@ -122,7 +122,22 @@ func (this *ChartInfoController) ChartInfoSave() {
 	}
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 
-	err = data_manage.ModifyChartInfoAndMapping(edbInfoIdStr, &req, chartItem.ChartType)
+	seasonExtraConfig := ""
+	if chartItem.ChartType == 2 {
+		if req.SeasonExtraConfig.XStartDate < req.SeasonExtraConfig.XEndDate && req.SeasonExtraConfig.JumpYear != 1 {
+			br.Msg = "季节性图表配置信息异常:横坐标日期配置错误"
+			return
+		}
+		seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
+		if tErr != nil {
+			br.Msg = "季节性图表配置信息异常"
+			br.ErrMsg = "季节性图表配置信息异常,Err:" + tErr.Error()
+			return
+		}
+
+		seasonExtraConfig = string(seasonExtra)
+	}
+	err = data_manage.ModifyChartInfoAndMapping(edbInfoIdStr, &req, chartItem.ChartType, seasonExtraConfig)
 	if err != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "保存失败,Err:" + err.Error()
@@ -760,43 +775,15 @@ func (this *ChartInfoController) ChartInfoDetail() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	seasonStartDate := this.GetString("SeasonStartDate")
-	seasonEndDate := this.GetString("SeasonEndDate")
+	startYear, _ := this.GetInt("StartYear")
 
 	edbInfoId := this.GetString("EdbInfoId")
 	chartType, _ := this.GetInt("ChartType")
 
-	fmt.Println("seasonStartDate:", seasonStartDate)
-	fmt.Println("seasonEndDate:", seasonEndDate)
-
 	calendar := this.GetString("Calendar")
 	if calendar == "" {
 		calendar = "公历"
 	}
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-	case 2:
-		startDate = "2010-01-01"
-	case 3:
-		startDate = "2015-01-01"
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
-	case 6:
-		startDate = startDate + "-01"
-	case 7:
-		startDate = "2018-01-01"
-	case 8:
-		startDate = "2019-01-01"
-	case 9:
-		startDate = "2020-01-01"
-	case 11:
-		startDate = "2022-01-01"
-	}
 
 	var err error
 	chartInfo := new(data_manage.ChartInfoView)
@@ -815,27 +802,6 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		chartType = chartInfo.ChartType
 	}
 
-	if chartType == 2 {
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
-			if tmpErr != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-				return
-			}
-			endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
-			//endDate = seasonEndDate + "-12-31"
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
-	}
-
 	mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
 	if chartInfoId > 0 {
 		mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId)
@@ -873,9 +839,27 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		}
 		extraConfigStr = chartInfo.BarConfig
 	}
+	yearMax := 0
+	if dateType == utils.DateTypeNYears {
+		for _, v := range mappingList {
+			if v.LatestDate != "" {
+				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
+				if tErr != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+					return
+				}
+				if lastDateT.Year() > yearMax {
+					yearMax = lastDateT.Year()
+				}
+			}
+		}
+	}
+	// 开始/结束日期
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {
@@ -920,6 +904,15 @@ func (this *ChartInfoController) ChartInfoDetail() {
 				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
 			}
 		}
+		if chartInfo.ChartType == 2 {
+			if chartInfo.SeasonStartDate != "" {
+				chartInfo.StartDate = chartInfo.SeasonStartDate
+				chartInfo.EndDate = chartInfo.SeasonEndDate
+				if chartInfo.DateType == 3 {
+					chartInfo.DateType = 5
+				}
+			}
+		}
 	}
 
 	//图表操作权限
@@ -987,43 +980,14 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 		return
 	}
 
-	seasonStartDate := req.SeasonStartDate
-	seasonEndDate := req.SeasonEndDate
-	fmt.Println("seasonStartDate:", seasonStartDate)
-	fmt.Println("seasonEndDate:", seasonEndDate)
-
 	calendar := req.Calendar
 	if calendar == "" {
 		calendar = "公历"
 	}
 
-	// 开始/结束日期
-	startDate, endDate := utils.GetDateByDateType(req.DateType, req.StartDate, req.EndDate)
-
 	chartInfo := new(data_manage.ChartInfoView)
 	chartInfo.ChartType = req.ChartType
 
-	if req.ChartType == 2 {
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
-			if tmpErr != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-				return
-			}
-			endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
-			//endDate = seasonEndDate + "-12-31"
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
-	}
-
 	edbInfoIdList := make([]int, 0)
 	edbInfoIdMapping := make(map[int]*data_manage.ChartSaveItem)
 	for _, v := range req.ChartEdbInfoList {
@@ -1036,7 +1000,7 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
-
+	yearMax := 0
 	for k, v := range mappingList {
 		if tmpV, ok := edbInfoIdMapping[v.EdbInfoId]; ok {
 			v.EdbInfoType = tmpV.EdbInfoType
@@ -1052,10 +1016,41 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 			v.PredictChartColor = tmpV.PredictChartColor
 			v.ChartWidth = tmpV.ChartWidth
 			//v.Source = tmpV.Source
+			// 得到指标更新的最新的年份
+			if req.DateType == utils.DateTypeNYears && v.LatestDate != "" {
+				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
+				if tErr != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+					return
+				}
+				if lastDateT.Year() > yearMax {
+					yearMax = lastDateT.Year()
+				}
+			}
 		}
 		mappingList[k] = v
 	}
 
+	// 开始/结束日期
+	startDate, endDate := utils.GetDateByDateTypeV2(req.DateType, req.StartDate, req.EndDate, req.StartYear, yearMax)
+	if startDate == "" {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败 时间格式错误"
+		return
+	}
+
+	var seasonExtraConfig string
+	if req.ChartType == 2 {
+		seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
+		if tErr != nil {
+			br.Msg = "季节性图表配置信息异常"
+			br.ErrMsg = "季节性图表配置信息异常,Err:" + tErr.Error()
+			return
+		}
+
+		seasonExtraConfig = string(seasonExtra)
+	}
 	// 图表额外数据参数
 	extraConfigStr := chartInfo.ExtraConfig
 	// 柱方图的一些配置
@@ -1076,7 +1071,7 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, req.ChartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, req.ChartType, calendar, startDate, endDate, mappingList, extraConfigStr, seasonExtraConfig)
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {
@@ -1165,42 +1160,19 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 
 	dateType := chartInfo.DateType
 	fmt.Println("dateType:", dateType)
-	if dateType <= 0 {
-		dateType = 3
-	}
 
 	chartType := chartInfo.ChartType
 	startDate := chartInfo.StartDate
 	endDate := chartInfo.EndDate
 	seasonStartDate := chartInfo.SeasonStartDate
 	seasonEndDate := chartInfo.SeasonEndDate
+	startYear := chartInfo.StartYear
+
 	calendar := chartInfo.Calendar
 
 	if calendar == "" {
 		calendar = "公历"
 	}
-	startDate, endDate = utils.GetDateByDateType(dateType, startDate, endDate)
-
-	if chartType == 2 {
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
-			if tmpErr != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-				return
-			}
-			endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
-			//endDate = seasonEndDate + "-12-31"
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
-	}
 
 	// 相关联指标
 	mappingList, err := data_manage.GetChartEdbMappingList(chartInfoId)
@@ -1210,6 +1182,43 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 		return
 	}
 
+	if chartType == 2 {
+		startDate = seasonStartDate
+		endDate = seasonEndDate
+		if dateType <= 0 {
+			if startDate != "" {
+				dateType = 5
+			} else {
+				dateType = utils.DateTypeNYears
+			}
+		}
+	} else {
+		if dateType <= 0 {
+			dateType = 3
+		}
+	}
+	yearMax := 0
+	if dateType == utils.DateTypeNYears {
+		for _, v := range mappingList {
+			if v.LatestDate != "" {
+				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
+				if tErr != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+					return
+				}
+				if lastDateT.Year() > yearMax {
+					yearMax = lastDateT.Year()
+				}
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
+
+	if chartInfo.ChartType == 2 {
+		chartInfo.StartDate = startDate
+		chartInfo.EndDate = endDate
+	}
 	// 图表额外数据参数
 	extraConfigStr := chartInfo.ExtraConfig
 	// 柱方图的一些配置
@@ -1230,7 +1239,7 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {
@@ -1406,56 +1415,26 @@ func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+	startYear, _ := this.GetInt("StartYear")
 
 	isTimeBetween := false //是否是时间区间
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-		endDate = ""
-	case 2:
-		startDate = "2010-01-01"
-		endDate = ""
-	case 3:
-		startDate = "2015-01-01"
-		endDate = ""
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-		endDate = ""
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
+	if dateType == 5 {
 		isTimeBetween = true
-	case 6:
-		//startDate = startDate + "-01"
-		endDate = ""
-	case 7:
-		startDate = "2018-01-01"
-		endDate = ""
-	case 8:
-		startDate = "2019-01-01"
-		endDate = ""
-	case 9:
-		startDate = "2020-01-01"
-		endDate = ""
-	case 11:
-		startDate = "2022-01-01"
-		endDate = ""
-	default:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
-	}
-
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
 	}
 
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.Msg = "获取失败,Err:" + err.Error()
+		return
+	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
 	if startDate == "" {
 		br.Msg = "参数错误"
 		br.Msg = "参数错误,无效的查询日期"
@@ -1496,13 +1475,6 @@ func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
 		startDateReal = startDate
 	}
 
-	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.Msg = "获取失败,Err:" + err.Error()
-		return
-	}
-
 	var dataList []*data_manage.EdbDataList
 	var minData, maxData float64
 
@@ -2050,13 +2022,12 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	chartInfoId := chartInfo.ChartInfoId
 
 	dateType := chartInfo.DateType
-	if dateType <= 0 {
-		dateType = 3
-	}
-	startDate := chartInfo.StartDate
-	endDate := chartInfo.EndDate
+
+	startDate := chartInfo.SeasonStartDate
+	endDate := chartInfo.SeasonEndDate
 	seasonStartDate := chartInfo.SeasonStartDate
 	seasonEndDate := chartInfo.SeasonEndDate
+	startYear := chartInfo.StartYear
 	calendar := chartInfo.Calendar
 	chartType := chartInfo.ChartType
 
@@ -2065,69 +2036,6 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	fmt.Println("a dateType:", dateType)
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-		endDate = ""
-	case 2:
-		startDate = "2010-01-01"
-		endDate = ""
-	case 3:
-		startDate = "2015-01-01"
-		endDate = ""
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-		endDate = ""
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
-	case 6:
-		//startDate = startDate + "-01"
-		endDate = ""
-	case 7:
-		startDate = "2018-01-01"
-		endDate = ""
-	case 8:
-		startDate = "2019-01-01"
-		endDate = ""
-	case 9:
-		startDate = "2020-01-01"
-		endDate = ""
-		endDate = ""
-	case 11:
-		startDate = "2022-01-01"
-		endDate = ""
-	}
-
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
-	}
-	if chartType == 2 {
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local)
-			if tmpErr != nil {
-				msg = "获取失败"
-				errMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-				return
-			}
-			endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
-		} else {
-			//endDate = time.Now().Format(utils.FormatDate)
-		}
-	}
 
 	mappingList, err := data_manage.GetChartEdbMappingList(chartInfoId)
 	if err != nil {
@@ -2135,6 +2043,43 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+	if chartType == 2 {
+		startDate = seasonStartDate
+		endDate = seasonEndDate
+		if dateType <= 0 {
+			if startDate != "" {
+				dateType = 5
+			} else {
+				dateType = utils.DateTypeNYears
+			}
+		}
+	} else {
+		if dateType <= 0 {
+			dateType = 3
+		}
+	}
+	yearMax := 0
+	if dateType == utils.DateTypeNYears {
+		for _, v := range mappingList {
+			if v.LatestDate != "" {
+				lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
+				if tErr != nil {
+					msg = "获取失败"
+					errMsg = "获取图表日期信息失败,Err:" + tErr.Error()
+					return
+				}
+				if lastDateT.Year() > yearMax {
+					yearMax = lastDateT.Year()
+				}
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
+
+	if chartInfo.ChartType == 2 {
+		chartInfo.StartDate = startDate
+		chartInfo.EndDate = endDate
+	}
 
 	extraConfigStr := chartInfo.ExtraConfig //图表额外数据参数
 	var barConfig data_manage.BarChartInfoReq
@@ -2157,7 +2102,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
 	if err != nil {
 		msg = "获取失败"
 		if errMsg != `` {
@@ -2672,7 +2617,7 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, chartType, "", "", "", mappingList, string(this.Ctx.Input.RequestBody))
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, chartType, "", "", "", mappingList, string(this.Ctx.Input.RequestBody), "")
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {
@@ -2767,7 +2712,7 @@ func (this *ChartInfoController) PreviewSectionScatterChartInfo() {
 	mappingList, err := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbInfoIdArr)
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, chartType, "", "", "", mappingList, req.ExtraConfig)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, chartType, "", "", "", mappingList, req.ExtraConfig, "")
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {

+ 27 - 16
controllers/data_manage/edb_info.go

@@ -2958,7 +2958,7 @@ func (this *ChartInfoController) EdbInfoData() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	startDate, endDate = utils.GetDateByDateType(dateType, startDate, endDate)
+	startYear, _ := this.GetInt("StartYear")
 
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
 	if err != nil {
@@ -2966,6 +2966,13 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.Msg = "获取失败,Err:" + err.Error()
 		return
 	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
 	dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDate, endDate)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -3664,7 +3671,7 @@ func (this *ChartInfoController) EdbInfoDataTb() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	startDate, endDate = utils.GetDateByDateType(dateType, startDate, endDate)
+	startYear, _ := this.GetInt("StartYear")
 
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
 	if err != nil {
@@ -3672,6 +3679,13 @@ func (this *ChartInfoController) EdbInfoDataTb() {
 		br.Msg = "获取失败,Err:" + err.Error()
 		return
 	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
 
 	var startDateTime time.Time
 	if startDate != `` {
@@ -3734,8 +3748,10 @@ func (this *ChartInfoController) EdbInfoDataSeasonal() {
 		br.Ret = 408
 		return
 	}
+	dateType, _ := this.GetInt("DateType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+	startYear, _ := this.GetInt("StartYear")
 
 	edbInfoIdStr := this.GetString("EdbInfoId")
 	edbInfoId, err := strconv.Atoi(edbInfoIdStr)
@@ -3752,20 +3768,8 @@ func (this *ChartInfoController) EdbInfoDataSeasonal() {
 	if calendar == "" {
 		calendar = "公历"
 	}
-	if startDate != `` {
-		startDate = startDate + "-01"
-	} else {
-		fivePre := time.Now().AddDate(-4, 0, 0).Year()
-		startDate = strconv.Itoa(fivePre) + "-01-01"
-	}
-	if endDate != `` {
-		seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, endDate+"-01", time.Local)
-		if tmpErr != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-			return
-		}
-		endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
+	if dateType == 0 {
+		dateType = utils.DateTypeNYears
 	}
 
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
@@ -3774,6 +3778,13 @@ func (this *ChartInfoController) EdbInfoDataSeasonal() {
 		br.Msg = "获取失败,Err:" + err.Error()
 		return
 	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
 
 	dataList, err := data.GetChartEdbSeasonalData(calendar, startDate, endDate, edbInfo)
 	if err != nil {

+ 28 - 94
controllers/data_manage/future_good/future_good_chart_info.go

@@ -493,8 +493,8 @@ func (this *FutureGoodChartInfoController) ChartInfoAdd() {
 	}
 	chartInfo.StartDate = req.StartDate
 	chartInfo.EndDate = req.EndDate
-	chartInfo.SeasonStartDate = req.SeasonStartDate
-	chartInfo.SeasonEndDate = req.SeasonEndDate
+	chartInfo.SeasonStartDate = req.StartDate
+	chartInfo.SeasonEndDate = req.EndDate
 	chartInfo.LeftMin = req.LeftMin
 	chartInfo.LeftMax = req.LeftMax
 	chartInfo.RightMin = req.RightMin
@@ -1236,8 +1236,10 @@ func (this *FutureGoodChartInfoController) ChartInfoDetail() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	seasonStartDate := this.GetString("SeasonStartDate")
-	seasonEndDate := this.GetString("SeasonEndDate")
+	startYear, _ := this.GetInt("StartYear")
+
+	//seasonStartDate := this.GetString("SeasonStartDate")
+	//seasonEndDate := this.GetString("SeasonEndDate")
 
 	chartType, _ := this.GetInt("ChartType")
 
@@ -1245,30 +1247,6 @@ func (this *FutureGoodChartInfoController) ChartInfoDetail() {
 	if calendar == "" {
 		calendar = "公历"
 	}
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-	case 2:
-		startDate = "2010-01-01"
-	case 3:
-		startDate = "2015-01-01"
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
-	case 6:
-		startDate = startDate + "-01"
-	case 7:
-		startDate = "2018-01-01"
-	case 8:
-		startDate = "2019-01-01"
-	case 9:
-		startDate = "2020-01-01"
-	case 11:
-		startDate = "2022-01-01"
-	}
 
 	var err error
 	chartInfo := new(data_manage.ChartInfoView)
@@ -1287,23 +1265,9 @@ func (this *FutureGoodChartInfoController) ChartInfoDetail() {
 		chartType = chartInfo.ChartType
 	}
 
-	if chartType == 2 {
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			endDate = seasonEndDate + "-12-31"
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
-	}
-
 	switch chartInfo.Source {
 	case utils.CHART_SOURCE_FUTURE_GOOD:
-		getFutureGoodChartInfo(chartInfo, startDate, endDate, sysUser, br)
+		getFutureGoodChartInfo(chartInfo, chartType, dateType, startYear, startDate, endDate, sysUser, br)
 		return
 	case utils.CHART_SOURCE_FUTURE_GOOD_PROFIT:
 		getFutureGoodProfitChartInfo(chartInfo, sysUser, br)
@@ -1312,7 +1276,7 @@ func (this *FutureGoodChartInfoController) ChartInfoDetail() {
 }
 
 // getFutureGoodChartInfo 获取商品价格曲线的数据
-func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, startDate, endDate string, sysUser *system.Admin, br *models.BaseResponse) {
+func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, chartType, dateType, startYear int, startDate, endDate string, sysUser *system.Admin, br *models.BaseResponse) {
 	chartInfoId := chartInfo.ChartInfoId
 
 	var edbInfoMapping, futureGoodEdbInfoMapping *data_manage.ChartEdbInfoMapping
@@ -1342,6 +1306,13 @@ func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, startDate, end
 		return
 	}
 
+	maxYear := 0
+	if edbInfoMapping.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfoMapping.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
+
 	// 商品价格曲线图的一些配置
 	var barConfig data_manage.BarChartInfoReq
 	barChartInfoDateList := make([]data_manage.BarChartInfoDateReq, 0)
@@ -1786,56 +1757,26 @@ func (this *FutureGoodChartInfoController) ChartInfoEdbInfoDetail() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+	startYear, _ := this.GetInt("StartYear")
 
 	isTimeBetween := false //是否是时间区间
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-		endDate = ""
-	case 2:
-		startDate = "2010-01-01"
-		endDate = ""
-	case 3:
-		startDate = "2015-01-01"
-		endDate = ""
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-		endDate = ""
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
+	if dateType == 5 {
 		isTimeBetween = true
-	case 6:
-		//startDate = startDate + "-01"
-		endDate = ""
-	case 7:
-		startDate = "2018-01-01"
-		endDate = ""
-	case 8:
-		startDate = "2019-01-01"
-		endDate = ""
-	case 9:
-		startDate = "2020-01-01"
-		endDate = ""
-	case 11:
-		startDate = "2022-01-01"
-		endDate = ""
-	default:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
 	}
 
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.Msg = "获取失败,Err:" + err.Error()
+		return
+	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
 	}
 
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
 	if startDate == "" {
 		br.Msg = "参数错误"
 		br.Msg = "参数错误,无效的查询日期"
@@ -1876,13 +1817,6 @@ func (this *FutureGoodChartInfoController) ChartInfoEdbInfoDetail() {
 		startDateReal = startDate
 	}
 
-	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.Msg = "获取失败,Err:" + err.Error()
-		return
-	}
-
 	var dataList []*data_manage.EdbDataList
 	var minData, maxData float64
 

+ 44 - 16
controllers/data_manage/line_feature/chart_info.go

@@ -168,12 +168,16 @@ func (this *LineFeaturesChartInfoController) MultipleGraphPreview() {
 
 	// 曲线图表信息
 	curveConf := req.Curve
-	startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
+	maxYear := 0
+	if edbInfoMapping.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfoMapping.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+	startDate, endDate := utils.GetDateByDateTypeV2(curveConf.DateType, curveConf.StartDate, curveConf.EndDate, curveConf.StartYear, maxYear)
 	{
 		tmpChartInfo := *chartInfo
-
 		// 获取图表中的指标数据
-		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, []*data_manage.ChartEdbInfoMapping{edbInfoMapping}, tmpChartInfo.ExtraConfig)
+		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, []*data_manage.ChartEdbInfoMapping{edbInfoMapping}, tmpChartInfo.ExtraConfig, tmpChartInfo.SeasonExtraConfig)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -428,10 +432,15 @@ func (this *LineFeaturesChartInfoController) MultipleGraphPreviewCurve() {
 		tmpChartInfo := *chartInfo
 
 		curveConf := req.Curve
-		startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
+		maxYear := 0
+		if edbInfoMapping.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbInfoMapping.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate := utils.GetDateByDateTypeV2(curveConf.DateType, curveConf.StartDate, curveConf.EndDate, curveConf.StartYear, maxYear)
 
 		// 获取图表中的指标数据
-		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, []*data_manage.ChartEdbInfoMapping{edbInfoMapping}, tmpChartInfo.ExtraConfig)
+		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, []*data_manage.ChartEdbInfoMapping{edbInfoMapping}, tmpChartInfo.ExtraConfig, tmpChartInfo.SeasonExtraConfig)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -573,7 +582,12 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 	isSendEmail := true
 
 	curveConf := req.Curve
-	startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
+	maxYear := 0
+	if edbInfoMapping.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfoMapping.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+	startDate, endDate := utils.GetDateByDateTypeV2(curveConf.DateType, curveConf.StartDate, curveConf.EndDate, curveConf.StartYear, maxYear)
 	switch req.Source {
 	case utils.CHART_MULTIPLE_GRAPH_CURVE: // 曲线图
 		curveConf := req.Curve
@@ -605,8 +619,6 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				StartDate:        curveConf.StartDate,
 				EndDate:          curveConf.EndDate,
 				Calendar:         "公历",
-				SeasonStartDate:  curveConf.StartDate,
-				SeasonEndDate:    curveConf.EndDate,
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 			}
@@ -622,8 +634,6 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				StartDate:        curveConf.StartDate,
 				EndDate:          curveConf.EndDate,
 				Calendar:         "公历",
-				SeasonStartDate:  curveConf.StartDate,
-				SeasonEndDate:    curveConf.EndDate,
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 			}
@@ -906,8 +916,6 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 			StartDate:        curveConf.StartDate,
 			EndDate:          curveConf.EndDate,
 			Calendar:         "公历",
-			SeasonStartDate:  curveConf.StartDate,
-			SeasonEndDate:    curveConf.EndDate,
 			LeftMin:          fmt.Sprint(curveConf.LeftMin),
 			LeftMax:          fmt.Sprint(curveConf.LeftMax),
 		}
@@ -1810,7 +1818,12 @@ func (this *LineFeaturesChartInfoController) Detail() {
 			br.ErrMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		maxYear := 0
+		if edbMapping.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbMapping.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate := utils.GetDateByDateTypeV2(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate, chartInfo.StartYear, maxYear)
 		edbList, resultResp, err, errMsg = lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbMapping, calculateValue)
 	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
 		var percentileConfig request.Percentile
@@ -1820,7 +1833,12 @@ func (this *LineFeaturesChartInfoController) Detail() {
 			br.ErrMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		maxYear := 0
+		if edbMapping.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbMapping.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate := utils.GetDateByDateTypeV2(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate, chartInfo.StartYear, maxYear)
 		edbList, resultResp, err, errMsg = lineFeatureServ.GetPercentileData(0, startDate, endDate, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
 	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
 		var frequencyDistributionConfig request.FrequencyDistribution
@@ -2284,7 +2302,12 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 			errMsg = "格式化配置项失败,Err:" + tmpErr.Error()
 			return
 		}
-		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		maxYear := 0
+		if edbMapping.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbMapping.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate := utils.GetDateByDateTypeV2(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate, chartInfo.StartYear, maxYear)
 		edbList, resultResp, err, msg = lineFeatureServ.GetStandardDeviationData(0, startDate, endDate, edbMapping, calculateValue)
 	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
 		var percentileConfig request.Percentile
@@ -2294,7 +2317,12 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 			errMsg = "格式化配置项失败,Err:" + err.Error()
 			return
 		}
-		startDate, endDate := utils.GetDateByDateType(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate)
+		maxYear := 0
+		if edbMapping.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbMapping.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate := utils.GetDateByDateTypeV2(chartInfo.DateType, chartInfo.StartDate, chartInfo.EndDate, chartInfo.StartYear, maxYear)
 		edbList, resultResp, err, msg = lineFeatureServ.GetPercentileData(0, startDate, endDate, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
 	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
 		var frequencyDistributionConfig request.FrequencyDistribution

+ 13 - 11
controllers/data_manage/multiple_graph_config.go

@@ -183,6 +183,7 @@ func (this *ChartInfoController) MultipleGraphPreview() {
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+	maxYear := 0
 	var edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping
 	for _, v := range mappingList {
 		if v.EdbInfoId == req.EdbInfoIdA {
@@ -191,6 +192,10 @@ func (this *ChartInfoController) MultipleGraphPreview() {
 		if v.EdbInfoId == req.EdbInfoIdB {
 			edbInfoMappingB = v
 		}
+		if v.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, v.LatestDate)
+			maxYear = latestDateT.Year()
+		}
 	}
 	if edbInfoMappingA == nil {
 		br.Msg = "指标A不存在"
@@ -212,13 +217,12 @@ func (this *ChartInfoController) MultipleGraphPreview() {
 	// 曲线图表信息
 	{
 		tmpChartInfo := *chartInfo
-
 		curveConf := req.Curve
-		startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
 		edbInfoType := 0
 		if curveConf.EdbInfoType {
 			edbInfoType = 1
 		}
+
 		for _, v := range mappingList {
 			v.EdbInfoType = 1
 			v.IsOrder = false
@@ -230,8 +234,9 @@ func (this *ChartInfoController) MultipleGraphPreview() {
 			}
 		}
 
+		startDate, endDate := utils.GetDateByDateTypeV2(curveConf.DateType, curveConf.StartDate, curveConf.EndDate, curveConf.StartYear, maxYear)
 		// 获取图表中的指标数据
-		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, mappingList, tmpChartInfo.ExtraConfig)
+		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, mappingList, tmpChartInfo.ExtraConfig, tmpChartInfo.SeasonExtraConfig)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -349,7 +354,7 @@ func (this *ChartInfoController) MultipleGraphPreview() {
 
 			// 数据的开始/结束日期
 			curveConf := req.Curve
-			startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
+			startDate, endDate := utils.GetDateByDateTypeV2(curveConf.DateType, curveConf.StartDate, curveConf.EndDate, curveConf.StartYear, maxYear)
 
 			rollingCorrelationData := make([]interface{}, 0)
 			for _, rollingCorrelationConf := range rollingCorrelationConfList {
@@ -518,7 +523,7 @@ func (this *ChartInfoController) MultipleGraphPreviewCurve() {
 		}
 
 		// 获取图表中的指标数据
-		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, mappingList, tmpChartInfo.ExtraConfig)
+		edbList, _, _, _, err, errMsg := data.GetChartEdbData(tmpChartInfo.ChartInfoId, tmpChartInfo.ChartType, tmpChartInfo.Calendar, startDate, endDate, mappingList, tmpChartInfo.ExtraConfig, tmpChartInfo.SeasonExtraConfig)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -731,9 +736,8 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 				DateType:         curveConf.DateType,
 				StartDate:        curveConf.StartDate,
 				EndDate:          curveConf.EndDate,
+				StartYear:        curveConf.StartYear,
 				Calendar:         "公历",
-				SeasonStartDate:  curveConf.StartDate,
-				SeasonEndDate:    curveConf.EndDate,
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 				RightMin:         fmt.Sprint(curveConf.RightMin),
@@ -750,9 +754,8 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 				DateType:         curveConf.DateType,
 				StartDate:        curveConf.StartDate,
 				EndDate:          curveConf.EndDate,
+				StartYear:        curveConf.StartYear,
 				Calendar:         "公历",
-				SeasonStartDate:  curveConf.StartDate,
-				SeasonEndDate:    curveConf.EndDate,
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 				RightMin:         fmt.Sprint(curveConf.RightMin),
@@ -1037,9 +1040,8 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 			DateType:         curveConf.DateType,
 			StartDate:        curveConf.StartDate,
 			EndDate:          curveConf.EndDate,
+			StartYear:        curveConf.StartYear,
 			Calendar:         "公历",
-			SeasonStartDate:  curveConf.StartDate,
-			SeasonEndDate:    curveConf.EndDate,
 			LeftMin:          fmt.Sprint(curveConf.LeftMin),
 			LeftMax:          fmt.Sprint(curveConf.LeftMax),
 			RightMin:         fmt.Sprint(curveConf.RightMin),

+ 39 - 105
controllers/data_manage/predict_edb_info.go

@@ -1229,9 +1229,7 @@ func (this *PredictEdbInfoController) DataList() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-
-	seasonStartDate := this.GetString("SeasonStartDate")
-	seasonEndDate := this.GetString("SeasonEndDate")
+	startYear, _ := this.GetInt("StartYear")
 
 	chartType, _ := this.GetInt("ChartType")
 	if chartType <= 0 {
@@ -1246,58 +1244,10 @@ func (this *PredictEdbInfoController) DataList() {
 
 	if chartType == 2 {
 		dateType = 0
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			endDate = seasonEndDate + "-12-31"
-			isTimeBetween = true
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
+		isTimeBetween = true
 	}
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 2:
-		startDate = "2010-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 3:
-		startDate = "2015-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
+	if dateType == 5 {
 		isTimeBetween = true
-	case 6:
-		startDate = startDate + "-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 7:
-		startDate = "2018-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 8:
-		startDate = "2019-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 9:
-		startDate = "2020-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 10:
-		startDate = ""
-		endDate = ""
-	case 11:
-		startDate = "2022-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-		//default:
-		//startDate = startDate + "-01"
-		//endDate = endDate + "-01"
 	}
 
 	// 获取预测指标信息
@@ -1307,7 +1257,21 @@ func (this *PredictEdbInfoController) DataList() {
 		br.ErrMsg = "获取预测指标信息失败,Err:" + err.Error()
 		return
 	}
+	maxYear := 0
+	if edbInfo.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
+	if endDate == "" {
+		endDate = time.Now().Format(utils.FormatDate)
+	}
 
+	if dateType == 10 {
+		startDate = ""
+		endDate = ""
+	}
 	// 按钮校验
 	button := data.GetPredictEdbOpButton(this.SysUser, edbInfo.SysUserId)
 	button.AddButton = false
@@ -1376,8 +1340,10 @@ func (this *PredictEdbInfoController) ChartDataList() {
 	dateType := req.DateType
 	startDate := req.StartDate
 	endDate := req.EndDate
-	seasonStartDate := req.SeasonStartDate
-	seasonEndDate := req.SeasonEndDate
+	//seasonStartDate := req.SeasonStartDate
+	//seasonEndDate := req.SeasonEndDate
+	startYear := req.StartYear
+
 	calendar := req.Calendar
 	if calendar == "" {
 		calendar = "公历"
@@ -1387,58 +1353,10 @@ func (this *PredictEdbInfoController) ChartDataList() {
 
 	if req.ChartType == 2 {
 		dateType = 0
-		if seasonStartDate != "" {
-			startDate = seasonStartDate + "-01-01"
-		} else {
-			fivePre := time.Now().AddDate(-4, 0, 0).Year()
-			startDate = strconv.Itoa(fivePre) + "-01-01"
-		}
-		if seasonEndDate != "" {
-			endDate = seasonEndDate + "-12-31"
-			isTimeBetween = true
-		} else {
-			endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate)
-		}
+		isTimeBetween = true
 	}
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 2:
-		startDate = "2010-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 3:
-		startDate = "2015-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 4:
-		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
-		startDate = "2021-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 5:
-		startDate = startDate + "-01"
-		endDate = endDate + "-01"
+	if dateType == 5 {
 		isTimeBetween = true
-	case 6:
-		startDate = startDate + "-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 7:
-		startDate = "2018-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 8:
-		startDate = "2019-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 9:
-		startDate = "2020-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-	case 10:
-		startDate = ""
-		endDate = ""
-	case 11:
-		startDate = "2022-01-01"
-		endDate = time.Now().Format(utils.FormatDate)
-		//default:
-		//	startDate = startDate + "-01"
-		//	endDate = endDate + "-01"
 	}
 
 	// 规则列表
@@ -1551,6 +1469,22 @@ func (this *PredictEdbInfoController) ChartDataList() {
 		br.Success = true
 		return
 	}
+	// todo 确认预测指标是否用的是来源指标的最新日期
+	maxYear := 0
+	if sourceEdbInfoItem.LatestDate != "" {
+		latestDateT, _ := time.Parse(utils.FormatDate, sourceEdbInfoItem.LatestDate)
+		maxYear = latestDateT.Year()
+	}
+
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
+	if endDate == "" {
+		endDate = time.Now().Format(utils.FormatDate)
+	}
+
+	if dateType == 10 {
+		startDate = ""
+		endDate = ""
+	}
 
 	minValue := sourceEdbInfoItem.MinValue
 	maxValue := sourceEdbInfoItem.MaxValue

+ 16 - 18
controllers/data_manage/supply_analysis/variety_edb.go

@@ -2,8 +2,6 @@ package supply_analysis
 
 import (
 	"encoding/json"
-	"fmt"
-	"github.com/tealeg/xlsx"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/request"
@@ -12,6 +10,8 @@ import (
 	"eta/eta_api/services/data"
 	supply_analysisServ "eta/eta_api/services/data/supply_analysis"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"strconv"
@@ -561,7 +561,7 @@ func (this *VarietyController) EdbInfoDataTb() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	startDate, endDate = utils.GetDateByDateType(dateType, startDate, endDate)
+	startYear, _ := this.GetInt("StartYear")
 
 	varietyEdbInfo, err := supply_analysis.GetVarietyEdbInfoByVarietyEdbId(varietyEdbId)
 	if err != nil {
@@ -604,6 +604,8 @@ func (this *VarietyController) EdbInfoDataTb() {
 		Calendar:         "",
 	}
 
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, varietyEdbInfo.EndDate.Year())
+
 	var startDateTime time.Time
 	if startDate != `` {
 		startDateTime, err = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
@@ -679,22 +681,14 @@ func (this *VarietyController) EdbInfoDataSeasonal() {
 	if calendar == "" {
 		calendar = "公历"
 	}
+
+	dateType, _ := this.GetInt("DateType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	if startDate != `` {
-		startDate = startDate + "-01"
-	} else {
-		fivePre := time.Now().AddDate(-4, 0, 0).Year()
-		startDate = strconv.Itoa(fivePre) + "-01-01"
-	}
-	if endDate != `` {
-		seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, endDate+"-01", time.Local)
-		if tmpErr != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error()
-			return
-		}
-		endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
+	startYear, _ := this.GetInt("StartYear")
+
+	if dateType == 0 {
+		dateType = utils.DateTypeNYears
 	}
 
 	// 指标详情
@@ -739,6 +733,8 @@ func (this *VarietyController) EdbInfoDataSeasonal() {
 		Calendar:         "",
 	}
 
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, varietyEdbInfo.EndDate.Year())
+
 	dataList, minVal, maxVal, err := supply_analysisServ.GetChartEdbSeasonalData(varietyEdbId, calendar, startDate, endDate, edbInfo.LatestDate)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -793,7 +789,7 @@ func (this *VarietyController) EdbDataListV2() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-	startDate, endDate = utils.GetDateByDateType(dateType, startDate, endDate)
+	startYear, _ := this.GetInt("StartYear")
 
 	varietyEdbInfo, err := supply_analysis.GetVarietyEdbInfoByVarietyEdbId(varietyEdbId)
 	if err != nil {
@@ -836,6 +832,8 @@ func (this *VarietyController) EdbDataListV2() {
 		Calendar:         "",
 	}
 
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, varietyEdbInfo.EndDate.Year())
+
 	var startDateTime time.Time
 	if startDate != `` {
 		startDateTime, err = time.ParseInLocation(utils.FormatDate, startDate, time.Local)

+ 118 - 71
models/data_manage/chart_info.go

@@ -2,44 +2,46 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type ChartInfo struct {
-	ChartInfoId     int    `orm:"column(chart_info_id);pk"`
-	ChartName       string `description:"来源名称"`
-	ChartNameEn     string `description:"英文图表名称"`
-	ChartClassifyId int    `description:"图表分类id"`
-	SysUserId       int
-	SysUserRealName string
-	UniqueCode      string `description:"图表唯一编码"`
-	CreateTime      time.Time
-	ModifyTime      time.Time
-	DateType        int    `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
-	StartDate       string `description:"自定义开始日期"`
-	EndDate         string `description:"自定义结束日期"`
-	IsSetName       int    `description:"设置名称"`
-	EdbInfoIds      string `description:"指标id"`
-	ChartType       int    `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图"`
-	Calendar        string `description:"公历/农历"`
-	SeasonStartDate string `description:"季节性图开始日期"`
-	SeasonEndDate   string `description:"季节性图开始日期"`
-	ChartImage      string `description:"图表图片"`
-	Sort            int    `description:"排序字段,数字越小越排前面"`
-	LeftMin         string `description:"图表左侧最小值"`
-	LeftMax         string `description:"图表左侧最大值"`
-	RightMin        string `description:"图表右侧最小值"`
-	RightMax        string `description:"图表右侧最大值"`
-	Disabled        int    `description:"是否禁用,0:启用,1:禁用,默认:0"`
-	BarConfig       string `description:"柱方图的配置,json数据"`
-	Source          int    `description:"1:ETA图库;2:商品价格曲线"`
-	ExtraConfig     string `description:"图表额外配置,json数据"`
+	ChartInfoId       int    `orm:"column(chart_info_id);pk"`
+	ChartName         string `description:"来源名称"`
+	ChartNameEn       string `description:"英文图表名称"`
+	ChartClassifyId   int    `description:"图表分类id"`
+	SysUserId         int
+	SysUserRealName   string
+	UniqueCode        string `description:"图表唯一编码"`
+	CreateTime        time.Time
+	ModifyTime        time.Time
+	DateType          int    `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
+	StartDate         string `description:"自定义开始日期"`
+	EndDate           string `description:"自定义结束日期"`
+	IsSetName         int    `description:"设置名称"`
+	EdbInfoIds        string `description:"指标id"`
+	ChartType         int    `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图"`
+	Calendar          string `description:"公历/农历"`
+	SeasonStartDate   string `description:"季节性图开始日期"`
+	SeasonEndDate     string `description:"季节性图开始日期"`
+	ChartImage        string `description:"图表图片"`
+	Sort              int    `description:"排序字段,数字越小越排前面"`
+	LeftMin           string `description:"图表左侧最小值"`
+	LeftMax           string `description:"图表左侧最大值"`
+	RightMin          string `description:"图表右侧最小值"`
+	RightMax          string `description:"图表右侧最大值"`
+	Disabled          int    `description:"是否禁用,0:启用,1:禁用,默认:0"`
+	BarConfig         string `description:"柱方图的配置,json数据"`
+	Source            int    `description:"1:ETA图库;2:商品价格曲线"`
+	ExtraConfig       string `description:"图表额外配置,json数据"`
+	SeasonExtraConfig string `description:"季节性图表中的配置,json数据"`
+	StartYear         int    `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type ChartInfoMore struct {
@@ -139,19 +141,19 @@ func GetChartInfoViewByIds(chartInfoIds []string) (list []*ChartInfoView, err er
 }
 
 type SaveChartInfoReq struct {
-	ChartEdbInfoList []*ChartSaveItem `description:"指标及配置信息"`
-	ChartInfoId      int              `description:"图表id,新增时传0"`
-	DateType         int              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
-	StartDate        string           `description:"自定义开始日期"`
-	EndDate          string           `description:"自定义结束日期"`
-	Calendar         string           `description:"公历/农历"`
-	SeasonStartDate  string           `description:"季节性图开始日期"`
-	SeasonEndDate    string           `description:"季节性图开始日期"`
-	LeftMin          string           `description:"图表左侧最小值"`
-	LeftMax          string           `description:"图表左侧最大值"`
-	RightMin         string           `description:"图表右侧最小值"`
-	RightMax         string           `description:"图表右侧最大值"`
-	ExtraConfig      string           `description:"图表额外配置,json数据"`
+	ChartEdbInfoList  []*ChartSaveItem `description:"指标及配置信息"`
+	ChartInfoId       int              `description:"图表id,新增时传0"`
+	DateType          int              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
+	StartDate         string           `description:"自定义开始日期"`
+	EndDate           string           `description:"自定义结束日期"`
+	Calendar          string           `description:"公历/农历"`
+	LeftMin           string           `description:"图表左侧最小值"`
+	LeftMax           string           `description:"图表左侧最大值"`
+	RightMin          string           `description:"图表右侧最小值"`
+	RightMax          string           `description:"图表右侧最大值"`
+	ExtraConfig       string           `description:"图表额外配置,json数据"`
+	SeasonExtraConfig SeasonExtraItem  `description:"季节性图表中的配置,json数据"`
+	StartYear         int              `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type ChartSaveItem struct {
@@ -210,12 +212,10 @@ type EditChartInfoReq struct {
 	ChartClassifyId      int                     `description:"分类id"`
 	ChartEdbInfoList     []*ChartSaveItem        `description:"指标及配置信息"`
 	ChartType            int                     `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图,10:截面散点图"`
-	DateType             int                     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
+	DateType             int                     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今,20:N年至今"`
 	StartDate            string                  `description:"自定义开始日期"`
 	EndDate              string                  `description:"自定义结束日期"`
 	Calendar             string                  `description:"公历/农历"`
-	SeasonStartDate      string                  `description:"季节性图开始日期"`
-	SeasonEndDate        string                  `description:"季节性图开始日期"`
 	LeftMin              string                  `description:"图表左侧最小值"`
 	LeftMax              string                  `description:"图表左侧最大值"`
 	RightMin             string                  `description:"图表右侧最小值"`
@@ -223,6 +223,8 @@ type EditChartInfoReq struct {
 	BarChartInfo         BarChartInfoReq         `description:"柱方图的配置"`
 	CorrelationChartInfo CorrelationChartInfoReq `description:"相关性图表配置"`
 	ExtraConfig          string                  `description:"图表额外配置信息,json字符串"`
+	SeasonExtraConfig    SeasonExtraItem         `description:"季节性图表中的配置,json数据"`
+	StartYear            int                     `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type EditChartEnInfoReq struct {
@@ -465,6 +467,16 @@ type QuarterData struct {
 	Year                 int
 	DataList             []*EdbDataList
 	CuttingDataTimestamp int64 `description:"切割的时间戳"`
+	ChartLegend          string
+	Years                string
+}
+
+type QuarterXDateItem struct {
+	StartDate            time.Time
+	EndDate              time.Time
+	ShowName             string
+	ChartLegend          string
+	CuttingDataTimestamp int64 `description:"切割的时间戳"`
 }
 
 type QuarterDataByUniqueCode struct {
@@ -511,7 +523,7 @@ type YData struct {
 	UnitEn         string          `description:"英文单位名称"`
 }
 
-func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chartType int) (err error) {
+func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chartType int, seasonExtra string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -535,8 +547,9 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
  			  left_min=?,
 			  left_max=?,
 			  right_min=?,
-			  right_max=?`
-		pars := []interface{}{edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax}
+			  right_max=?, 
+              start_year=?`
+		pars := []interface{}{edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.StartYear}
 		if req.ExtraConfig != `` {
 			updateStr += `,extra_config=? `
 			pars = append(pars, req.ExtraConfig)
@@ -560,9 +573,11 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
 			  left_min=?,
 			  left_max=?,
 			  right_min=?,
-			  right_max=?
+			  right_max=?,
+			  season_extra_config=?,
+			  start_year=?
 			WHERE chart_info_id = ?`
-		_, err = to.Raw(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Exec()
+		_, err = to.Raw(sql, edbInfoIdStr, req.Calendar, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, seasonExtra, req.StartYear, req.ChartInfoId).Exec()
 		if err != nil {
 			fmt.Println("UPDATE  chart_info Err:", err.Error())
 			return err
@@ -645,7 +660,7 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
 }
 
 // EditChartInfoAndMapping 修改 ETA图库 的 图表与指标 的关系
-func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calendar string, dateType, disabled int, barChartConf string, chartEdbInfoList []*ChartSaveItem) (err error) {
+func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calendar string, dateType, disabled int, barChartConf string, chartEdbInfoList []*ChartSaveItem, seasonExtra string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -666,6 +681,8 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 	pars = append(pars, disabled)
 	pars = append(pars, barChartConf)
 	pars = append(pars, req.ExtraConfig)
+	pars = append(pars, seasonExtra)
+	pars = append(pars, req.StartYear)
 
 	sql := ` UPDATE  chart_info
 			SET
@@ -675,7 +692,10 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 			  chart_classify_id = ?,
 			  modify_time = NOW(),
               disabled = ?,
-              bar_config = ?,extra_config = ?
+              bar_config = ?,
+              extra_config = ?, 
+              season_extra_config = ?,
+ 			  start_year = ?
 			`
 	if calendar != "" {
 		sql += `,calendar = ? `
@@ -693,10 +713,10 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 	pars = append(pars, req.EndDate)
 
 	sql += `,season_start_date = ? `
-	pars = append(pars, req.SeasonStartDate)
+	pars = append(pars, req.StartDate)
 
 	sql += `,season_end_date = ? `
-	pars = append(pars, req.SeasonEndDate)
+	pars = append(pars, req.EndDate)
 
 	sql += `,left_min = ? `
 	pars = append(pars, req.LeftMin)
@@ -837,10 +857,10 @@ func EditFutureGoodChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr strin
 	pars = append(pars, req.EndDate)
 
 	sql += `,season_start_date = ? `
-	pars = append(pars, req.SeasonStartDate)
+	pars = append(pars, req.StartDate)
 
 	sql += `,season_end_date = ? `
-	pars = append(pars, req.SeasonEndDate)
+	pars = append(pars, req.EndDate)
 
 	sql += `,left_min = ? `
 	pars = append(pars, req.LeftMin)
@@ -1009,8 +1029,6 @@ type AddChartInfoReq struct {
 	StartDate            string                  `description:"自定义开始日期"`
 	EndDate              string                  `description:"自定义结束日期"`
 	Calendar             string                  `description:"公历/农历"`
-	SeasonStartDate      string                  `description:"季节性图开始日期"`
-	SeasonEndDate        string                  `description:"季节性图开始日期"`
 	LeftMin              string                  `description:"图表左侧最小值"`
 	LeftMax              string                  `description:"图表左侧最大值"`
 	RightMin             string                  `description:"图表右侧最小值"`
@@ -1019,25 +1037,52 @@ type AddChartInfoReq struct {
 	CorrelationChartInfo CorrelationChartInfoReq `description:"相关性图表配置"`
 	ExtraConfig          string                  `description:"图表额外配置信息,json字符串"`
 	ChartImage           string                  `description:"封面图" json:"-"`
+	SeasonExtraConfig    SeasonExtraItem         `description:"季节性图表中的配置,json数据"`
+	StartYear            int                     `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type PreviewChartInfoReq struct {
-	ChartEdbInfoList []*ChartSaveItem `description:"指标及配置信息"`
-	DateType         int              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
-	ChartType        int              `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图"`
-	StartDate        string           `description:"自定义开始日期"`
-	EndDate          string           `description:"自定义结束日期"`
-	Calendar         string           `description:"公历/农历"`
-	SeasonStartDate  string           `description:"季节性图开始日期"`
-	SeasonEndDate    string           `description:"季节性图开始日期"`
+	ChartEdbInfoList  []*ChartSaveItem `description:"指标及配置信息"`
+	DateType          int              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今 20:最近N年"`
+	ChartType         int              `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图"`
+	StartDate         string           `description:"自定义开始日期"`
+	EndDate           string           `description:"自定义结束日期"`
+	Calendar          string           `description:"公历/农历"`
+	SeasonExtraConfig SeasonExtraItem  `description:"季节性图表中的配置,json数据"`
+	StartYear         int              `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
+}
+
+type SeasonExtraItem struct {
+	ChartLegend []SeasonChartLegend `description:"自定义的图例名称"`
+	XStartDate  string              `description:"横坐标显示的起始日"`
+	XEndDate    string              `description:"横坐标显示的截止日"`
+	JumpYear    int                 `description:"横坐标日期是否跨年,1跨年,0不跨年"`
 }
 
+type SeasonChartLegend struct {
+	Name  string
+	Value string
+}
 type AddChartInfoResp struct {
 	ChartInfoId int    `description:"图表id"`
 	UniqueCode  string `description:"图表唯一编码"`
 	ChartType   int    `description:"生成样式:1:曲线图,2:季节性图"`
 }
 
+type QuarterDataList []*QuarterData
+
+func (m QuarterDataList) Len() int {
+	return len(m)
+}
+
+func (m QuarterDataList) Less(i, j int) bool {
+	return m[i].Years < m[j].Years
+}
+
+func (m QuarterDataList) Swap(i, j int) {
+	m[i], m[j] = m[j], m[i]
+}
+
 // 判断图表指标是否已经存在
 func ChartInfoExist(condition, edbInfoIdStr string) (count int, err error) {
 	sql := `SELECT COUNT(1) AS count FROM (
@@ -1282,8 +1327,10 @@ type ChartInfoView struct {
 	BarConfig         string `description:"柱方图的配置,json数据" json:"-"`
 	Source            int    `description:"1:ETA图库;2:商品价格曲线;3:相关性图表"`
 	//CorrelationLeadUnit string `description:"相关性图表-领先单位"`
-	ExtraConfig string          `description:"图表额外配置,json数据"`
-	Button      ChartViewButton `description:"操作按钮"`
+	ExtraConfig       string          `description:"图表额外配置,json数据"`
+	Button            ChartViewButton `description:"操作按钮"`
+	SeasonExtraConfig string          `description:"季节性图表中的配置,json数据"`
+	StartYear         int             `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type ChartViewButton struct {
@@ -1517,10 +1564,10 @@ func EditCorrelationChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr stri
 	pars = append(pars, req.EndDate)
 
 	sql += `,season_start_date = ? `
-	pars = append(pars, req.SeasonStartDate)
+	pars = append(pars, req.StartDate)
 
 	sql += `,season_end_date = ? `
-	pars = append(pars, req.SeasonEndDate)
+	pars = append(pars, req.EndDate)
 
 	sql += `,left_min = ? `
 	pars = append(pars, req.LeftMin)
@@ -1774,4 +1821,4 @@ func GetChartInfoAdminList() (items []int, err error) {
 
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
-}
+}

+ 4 - 4
models/data_manage/line_feature/line_feature.go

@@ -1,10 +1,10 @@
 package line_feature
 
 import (
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -97,10 +97,10 @@ func EditLineFeatureChartAndMapping(req *data_manage.EditChartInfoReq, edbInfoId
 	pars = append(pars, req.EndDate)
 
 	sql += `,season_start_date = ? `
-	pars = append(pars, req.SeasonStartDate)
+	pars = append(pars, req.StartDate)
 
 	sql += `,season_end_date = ? `
-	pars = append(pars, req.SeasonEndDate)
+	pars = append(pars, req.EndDate)
 
 	sql += `,left_min = ? `
 	pars = append(pars, req.LeftMin)

+ 2 - 1
models/data_manage/line_feature/request/line_feature.go

@@ -20,9 +20,10 @@ type ConfigSave struct {
 
 // CurveConfig 曲线图配置
 type CurveConfig struct {
-	DateType  int     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
+	DateType  int     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,20最近N年"`
 	StartDate string  `description:"自定义开始日期"`
 	EndDate   string  `description:"自定义结束日期"`
+	StartYear int     `description:"最近N年里的N"`
 	LeftMin   float64 `description:"图表左侧最小值"`
 	LeftMax   float64 `description:"图表左侧最大值"`
 }

+ 1 - 0
models/data_manage/multiple_graph_config.go

@@ -60,6 +60,7 @@ type CurveConfig struct {
 	EdbInfoType bool    `description:"true:标准指标,false:领先指标"`
 	LeadValue   int     `description:"领先值"`
 	LeadUnit    string  `description:"领先单位"`
+	StartYear   int     `description:"最近N年"`
 }
 
 // CorrelationConfig 相关性配置

+ 14 - 13
models/data_manage/request/predict_edb_info.go

@@ -4,19 +4,20 @@ import "eta/eta_api/models/data_manage"
 
 // PredictEdbInfoChartDataReq 获取预测指标绘图数据请求
 type PredictEdbInfoChartDataReq struct {
-	SourceEdbInfoId int          `description:"来源指标id"`
-	PredictEndDate  string       `description:"预测截止日期"`
-	RuleType        int          `description:"预测规则,1:最新,2:固定值"`
-	FixedValue      float64      `description:"固定值"`
-	DateType        int          `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:自定义起始时间至今,7:18年至今,8:19年至今,9:20年至今,10:全部"`
-	StartDate       string       `description:"自定义开始日期"`
-	EndDate         string       `description:"自定义结束日期"`
-	Calendar        string       `description:"公历/农历"`
-	ChartType       int          `description:"生成样式:1:曲线图,2:季节性图"`
-	SeasonStartDate string       `description:"季节性图开始日期"`
-	SeasonEndDate   string       `description:"季节性图结束日期"`
-	RuleList        []RuleConfig `description:"配置规则列表"`
-	DataDateType    string       `description:"数据日期类型,枚举值:交易日、自然日"`
+	SourceEdbInfoId int     `description:"来源指标id"`
+	PredictEndDate  string  `description:"预测截止日期"`
+	RuleType        int     `description:"预测规则,1:最新,2:固定值"`
+	FixedValue      float64 `description:"固定值"`
+	DateType        int     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:自定义起始时间至今,7:18年至今,8:19年至今,9:20年至今,10:全部"`
+	StartDate       string  `description:"自定义开始日期"`
+	EndDate         string  `description:"自定义结束日期"`
+	Calendar        string  `description:"公历/农历"`
+	ChartType       int     `description:"生成样式:1:曲线图,2:季节性图"`
+	//SeasonStartDate string       `description:"季节性图开始日期"`
+	//SeasonEndDate   string       `description:"季节性图结束日期"`
+	RuleList     []RuleConfig `description:"配置规则列表"`
+	DataDateType string       `description:"数据日期类型,枚举值:交易日、自然日"`
+	StartYear    int          `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 // AddPredictEdbInfoReq 添加预测指标请求

+ 430 - 92
services/data/chart_info.go

@@ -501,7 +501,7 @@ func CheckOpChartPermission(sysUser *system.Admin, createUserId int) (ok bool) {
 }
 
 // GetChartEdbData 获取图表的指标数据
-func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
+func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
 	edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
 	xEdbIdValue = make([]int, 0)
 	yDataList = make([]data_manage.YData, 0)
@@ -542,7 +542,7 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	}
 
 	// 指标对应的所有数据
-	edbDataListMap, edbList, err := getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
+	edbDataListMap, edbList, err := getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
 	if err != nil {
 		return
 	}
@@ -582,13 +582,13 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 }
 
 // GetEdbDataMapList 获取指标最后的基础数据
-func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
-	edbDataListMap, edbList, err = getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
+func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtra string) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
+	edbDataListMap, edbList, err = getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtra)
 	return
 }
 
 // getEdbDataMapList 获取指标最后的基础数据
-func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
+func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
 	// 指标对应的所有数据
 	edbDataListMap = make(map[int][]*data_manage.EdbDataList)
 
@@ -706,7 +706,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		}
 		dataList := make([]*data_manage.EdbDataList, 0)
 		//fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
-
+		fmt.Println("calendarPreYear:", calendarPreYear)
 		//var newEdbInfo *data_manage.EdbInfo
 		switch v.EdbInfoCategoryType {
 		case 0:
@@ -730,7 +730,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 
 		if chartType == 2 {
 			latestDateStr := v.LatestDate //实际数据的截止日期
-			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
+			_, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
 			if tmpErr != nil {
 				//item.DataList = dataList
 				item.IsNullData = true
@@ -739,102 +739,32 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
 				return
 			}
-			latestDateYear := latestDate.Year() //实际数据截止年份
+			//latestDateYear := latestDate.Year() //实际数据截止年份
 
 			if calendar == "农历" {
 				if len(dataList) <= 0 {
 					result := new(data_manage.EdbDataResult)
 					item.DataList = result
 				} else {
+					// todo 关于处理 calendarPreYear 上一年的数据
 					result, tmpErr := data_manage.AddCalculateQuarterV4(dataList)
 					if tmpErr != nil {
 						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
-					}
-
-					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...)
-						item.DataList = newResult
-					} else {
-						item.DataList = result
+					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, seasonExtraConfig, calendarPreYear)
+					if tErr != nil {
+						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+						return
 					}
+					item.DataList = quarterDataList
 				}
 
 			} else {
-				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)
+				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, seasonExtraConfig)
+				if tErr != nil {
+					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+					return
 				}
 				item.DataList = quarterDataList
 			}
@@ -849,6 +779,373 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 	return
 }
 
+// GetSeasonEdbInfoDataListByXDate 季节性图的指标数据根据横轴展示
+func GetSeasonEdbInfoDataListByXDate(dataList []*data_manage.EdbDataList, latestDateStr string, seasonExtraConfig string) (quarterDataListSort data_manage.QuarterDataList, err error) {
+	xStartDate := "01-01"
+	xEndDate := "12-31"
+	jumpYear := 0
+	legends := make([]data_manage.SeasonChartLegend, 0)
+	var seasonExtra data_manage.SeasonExtraItem
+	if seasonExtraConfig != "" {
+		err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
+		if err != nil {
+			return
+		}
+	}
+
+	if seasonExtra.XStartDate != "" {
+		xStartDate = seasonExtra.XStartDate
+		xEndDate = seasonExtra.XEndDate
+		jumpYear = seasonExtra.JumpYear
+		legends = seasonExtra.ChartLegend
+	}
+
+	length := len(dataList)
+	if length == 0 {
+		return
+	}
+	legendMap := make(map[string]string)
+	if len(legends) > 0 {
+		for _, v := range legends {
+			legendMap[v.Name] = v.Value
+		}
+	}
+	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
+	//根据数据确定最早的年份,和最近年份
+	//根据横轴的日期,汇总所有的年份
+	startDate := dataList[0].DataTime
+	startDateT, tmpErr := time.Parse(utils.FormatDate, startDate)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	startYear := startDateT.Year()
+	//获取数据的最新日期
+	lastDate := dataList[length-1].DataTime
+	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	endYear, _ := strconv.Atoi(lastDateT.Format(utils.FormatYearDate))
+	dataMap := make(map[string]data_manage.QuarterXDateItem)
+
+	quarterDataList := make([]*data_manage.QuarterData, 0)
+	quarterMap := make(map[string][]*data_manage.EdbDataList)
+
+	//整理出日期
+	leftNameFlag := true
+	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
+		startStr := fmt.Sprintf("%d-%s", currentStartYear, xStartDate)
+		currentEndYear := currentStartYear
+		if jumpYear == 1 {
+			currentEndYear = currentStartYear + 1
+		}
+		endStr := fmt.Sprintf("%d-%s", currentEndYear, xEndDate)
+		name := fmt.Sprintf("%s_%s", startStr, endStr)
+		showName := fmt.Sprintf("%d_%d", currentStartYear, currentEndYear)
+
+		startT, tEr := time.Parse(utils.FormatDate, startStr)
+		if tEr != nil {
+			err = tEr
+			return
+		}
+
+		endT, tEr := time.Parse(utils.FormatDate, endStr)
+		if tEr != nil {
+			err = tEr
+			return
+		}
+
+		if lastDateT.Before(startT) {
+			//如果最新的日期在起始日之前,则跳出循环
+			break
+		}
+
+		if startT.Before(lastDateT) && endT.After(lastDateT) {
+			if endYear > currentStartYear {
+				leftNameFlag = false
+			}
+		}
+		item := data_manage.QuarterXDateItem{
+			StartDate: startT,
+			EndDate:   endT,
+			ShowName:  showName,
+		}
+		dataMap[name] = item
+	}
+
+	for k, v := range dataMap {
+		if leftNameFlag {
+			v.ChartLegend = strconv.Itoa(v.StartDate.Year())
+		} else {
+			v.ChartLegend = strconv.Itoa(v.EndDate.Year())
+		}
+		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 {
+			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)
+					}
+				}
+				timestamp := newItemDate.UnixNano() / 1e6
+				v.DataTimestamp = timestamp
+				if findVal, ok := quarterMap[k]; !ok {
+					findVal = append(findVal, v)
+					quarterMap[k] = findVal
+				} else {
+					findVal = append(findVal, v)
+					quarterMap[k] = findVal
+				}
+
+				if v.DataTime == latestDateStr {
+					dateItem.CuttingDataTimestamp = v.DataTimestamp
+					dataMap[k] = dateItem
+				}
+				break
+			}
+		}
+	}
+	latestDate, _ := time.Parse(utils.FormatDate, latestDateStr)
+	for k, v := range dataMap {
+		itemList := quarterMap[k]
+		quarterItem := new(data_manage.QuarterData)
+		quarterItem.Years = v.ShowName
+		quarterItem.ChartLegend = v.ChartLegend
+		if le, ok := legendMap[v.ShowName]; ok {
+			quarterItem.ChartLegend = le
+		}
+		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)
+	}
+
+	// todo 处理图例名称
+	if len(quarterDataList) > 0 {
+		quarterDataListSort = quarterDataList
+		sort.Sort(quarterDataListSort)
+	}
+	return
+}
+
+// GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
+func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, latestDateStr string, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort data_manage.QuarterDataList, err error) {
+	xStartDate := "01-01"
+	xEndDate := "12-31"
+	jumpYear := 0
+	legends := make([]data_manage.SeasonChartLegend, 0)
+	var seasonExtra data_manage.SeasonExtraItem
+	if seasonExtraConfig != "" {
+		err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
+		if err != nil {
+			return
+		}
+	}
+
+	if seasonExtra.XStartDate != "" {
+		xStartDate = seasonExtra.XStartDate
+		xEndDate = seasonExtra.XEndDate
+		jumpYear = seasonExtra.JumpYear
+		legends = seasonExtra.ChartLegend
+	}
+
+	length := len(result.List)
+	if length == 0 {
+		return
+	}
+	legendMap := make(map[string]string)
+	if len(legends) > 0 {
+		for _, v := range legends {
+			legendMap[v.Name] = v.Value
+		}
+	}
+	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
+	//根据数据确定最早的年份,和最近年份
+	//根据横轴的日期,汇总所有的年份
+	startYear := result.List[0].Year
+
+	itemLength := len(result.List[length-1].Items)
+	//获取数据的最新日期
+	lastDate := result.List[length-1].Items[itemLength-1].DataTime
+	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	endYear, _ := strconv.Atoi(lastDateT.Format(utils.FormatYearDate))
+	dataMap := make(map[string]data_manage.QuarterXDateItem)
+
+	quarterDataList := make([]*data_manage.QuarterData, 0)
+	//resultData := make([]*data_manage.QuarterData, 0)
+	quarterMap := make(map[string][]*data_manage.EdbDataList)
+	//整理出日期
+	leftNameFlag := true
+	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
+		startStr := fmt.Sprintf("%d-%s", currentStartYear, xStartDate)
+		currentEndYear := currentStartYear
+		if jumpYear == 1 {
+			currentEndYear = currentStartYear + 1
+		}
+		endStr := fmt.Sprintf("%d-%s", currentEndYear, xEndDate)
+		showName := fmt.Sprintf("%d_%d", currentStartYear, currentEndYear)
+
+		startT, tEr := time.Parse(utils.FormatDate, startStr)
+		if tEr != nil {
+			err = tEr
+			return
+		}
+
+		endT, tEr := time.Parse(utils.FormatDate, endStr)
+		if tEr != nil {
+			err = tEr
+			return
+		}
+
+		if lastDateT.Before(startT) {
+			//如果最新的日期在起始日之前,则跳出循环
+			break
+		}
+
+		if (startT.Before(lastDateT) && endT.After(lastDateT)) || startT == lastDateT || endT == lastDateT {
+			if endYear > currentStartYear {
+				leftNameFlag = false
+			}
+		}
+		item := data_manage.QuarterXDateItem{
+			StartDate: startT,
+			EndDate:   endT,
+			ShowName:  showName,
+		}
+		dataMap[showName] = item
+	}
+	for k, v := range dataMap {
+		if leftNameFlag {
+			v.ChartLegend = strconv.Itoa(v.StartDate.Year())
+		} else {
+			v.ChartLegend = strconv.Itoa(v.EndDate.Year())
+		}
+		dataMap[k] = v
+	}
+
+	yearDataListMap := make(map[int]*data_manage.EdbDataItems)
+
+	for _, lv := range result.List {
+		yearDataListMap[lv.Year] = lv
+	}
+
+	for name, dateItem := range dataMap {
+		lv, ok1 := yearDataListMap[dateItem.StartDate.Year()]
+		if startYear == calendarPreYear {
+			lv, ok1 = yearDataListMap[dateItem.EndDate.Year()]
+		}
+		if !ok1 {
+			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
+			if !ok1 {
+				break
+			}
+		}
+		//判断哪些点应该落在同一条时间线上
+		maxY := 0
+		for _, item := range lv.Items {
+			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
+			if dataTimeT.Year() > maxY {
+				maxY = dataTimeT.Year()
+			}
+		}
+		endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
+		endTmpT, _ := time.Parse(utils.FormatDate, endTmp)
+		minY := maxY
+		if jumpYear == 1 {
+			minY = maxY - 1
+		}
+		startTmp := fmt.Sprintf("%d-%s", minY, xStartDate)
+		startTmpT, _ := time.Parse(utils.FormatDate, startTmp)
+
+		for _, item := range lv.Items {
+			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
+				}
+
+				// todo 统计截止日
+				if lv.Year == endYear && item.DataTime == latestDateStr {
+					if dv, ok1 := dataMap[name]; ok1 {
+						dv.CuttingDataTimestamp = item.DataTimestamp
+						dataMap[name] = dv
+					}
+				}
+			}
+		}
+	}
+
+	latestDate, _ := time.Parse(utils.FormatDate, latestDateStr)
+	for k, v := range dataMap {
+		itemList := quarterMap[k]
+		quarterItem := new(data_manage.QuarterData)
+		quarterItem.Years = v.ShowName
+		quarterItem.ChartLegend = v.ChartLegend
+		if le, ok := legendMap[v.ShowName]; ok {
+			quarterItem.ChartLegend = le
+		}
+		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 startYear != calendarPreYear {
+		itemList := make([]*data_manage.EdbDataList, 0)
+		items := new(data_manage.QuarterData)
+		//items.Year = calendarPreYear
+		items.DataList = itemList
+
+		newResult := make([]*data_manage.QuarterData, 0)
+		newResult = append(newResult, items)
+		newResult = append(newResult, quarterDataList...)
+		resultData = newResult
+	} else {
+		resultData = quarterDataList
+	}*/
+
+	if len(quarterDataList) > 0 {
+		quarterDataListSort = quarterDataList
+		sort.Sort(quarterDataListSort)
+	}
+	return
+}
+
 // BarChartData 柱方图的数据处理
 func BarChartData(mappingList []*data_manage.ChartEdbInfoMapping, edbDataListMap map[int][]*data_manage.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbIdList []int, yDataList []data_manage.YData, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
@@ -1568,6 +1865,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	chartType := req.ChartType
 	extraConfig := req.ExtraConfig
 
+	// 季节性图表额外配置信息
+	var seasonExtraConfig string
 	// 关联指标
 	var edbInfoIdArr []int
 	chartEdbInfoList := req.ChartEdbInfoList
@@ -1614,6 +1913,23 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 				if existCount <= 0 {
 					go data_manage.AddCalculateQuarter(edbInfoId, edbInfo.Source, edbInfo.EdbCode)
 				}
+
+				// 处理季节性图表横轴配置
+				{
+					if req.SeasonExtraConfig.XStartDate < req.SeasonExtraConfig.XEndDate && req.SeasonExtraConfig.JumpYear != 1 {
+						errMsg = "季节性图表配置信息异常:横坐标日期配置错误"
+						err = errors.New("季节性图表配置信息异常: 横坐标日期配置错误")
+						return
+					}
+					seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
+					if tErr != nil {
+						errMsg = "季节性图表配置信息异常"
+						err = errors.New("季节性图表配置信息异常,Err:" + tErr.Error())
+						return
+					}
+
+					seasonExtraConfig = string(seasonExtra)
+				}
 			}
 		}
 	} else {
@@ -1758,6 +2074,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
 
+	// todo 判断是否需要重新计算用户的start_date
 	if req.DateType > 0 {
 		chartInfo.DateType = req.DateType
 	} else {
@@ -1772,11 +2089,12 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	if calendar == "" {
 		calendar = "公历"
 	}
+
 	chartInfo.Calendar = calendar
 	chartInfo.StartDate = req.StartDate
 	chartInfo.EndDate = req.EndDate
-	chartInfo.SeasonStartDate = req.SeasonStartDate
-	chartInfo.SeasonEndDate = req.SeasonEndDate
+	chartInfo.SeasonStartDate = req.StartDate
+	chartInfo.SeasonEndDate = req.EndDate
 	chartInfo.LeftMin = req.LeftMin
 	chartInfo.LeftMax = req.LeftMax
 	chartInfo.RightMin = req.RightMin
@@ -1784,6 +2102,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	chartInfo.Disabled = disableVal
 	chartInfo.BarConfig = barChartConf
 	chartInfo.ExtraConfig = extraConfig
+	chartInfo.SeasonExtraConfig = seasonExtraConfig
+	chartInfo.StartYear = req.StartYear
 	chartInfo.Source = utils.CHART_SOURCE_DEFAULT
 	newId, err := data_manage.AddChartInfo(chartInfo)
 	if err != nil {
@@ -1876,6 +2196,8 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 		return
 	}
 
+	// 季节性图表额外配置信息
+	var seasonExtraConfig string
 	// 图表关联指标id
 	chartEdbInfoList := make([]*data_manage.ChartSaveItem, 0)
 	// 关联指标
@@ -1925,6 +2247,23 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 				if existCount <= 0 {
 					go data_manage.AddCalculateQuarter(edbInfoId, edbInfo.Source, edbInfo.EdbCode)
 				}
+
+				// 处理季节性图表横轴配置
+				{
+					if req.SeasonExtraConfig.XStartDate < req.SeasonExtraConfig.XEndDate && req.SeasonExtraConfig.JumpYear != 1 {
+						errMsg = "季节性图表配置信息异常:横坐标日期配置错误"
+						err = errors.New("季节性图表配置信息异常: 横坐标日期配置错误")
+						return
+					}
+					seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
+					if tErr != nil {
+						errMsg = "季节性图表配置信息异常"
+						err = errors.New("季节性图表配置信息异常,Err:" + tErr.Error())
+						return
+					}
+
+					seasonExtraConfig = string(seasonExtra)
+				}
 			}
 		}
 		chartEdbInfoList = req.ChartEdbInfoList
@@ -2015,7 +2354,6 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 			dateType = 3
 		}
 	}
-
 	sort.Ints(edbInfoIdArr)
 	var edbInfoIdArrStr []string
 	for _, v := range edbInfoIdArr {
@@ -2087,7 +2425,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	// 图表启用与否
 	disableVal := CheckIsDisableChart(edbInfoIdArr)
 
-	err = data_manage.EditChartInfoAndMapping(&req, edbInfoIdStr, calendar, dateType, disableVal, barChartConf, chartEdbInfoList)
+	err = data_manage.EditChartInfoAndMapping(&req, edbInfoIdStr, calendar, dateType, disableVal, barChartConf, chartEdbInfoList, seasonExtraConfig)
 	if err != nil {
 		errMsg = "保存失败"
 		err = errors.New("保存失败,Err:" + err.Error())

+ 2 - 2
services/data/correlation/chart_info.go

@@ -798,8 +798,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
 	chartInfo.DateType = 6
 	chartInfo.StartDate = req.StartDate
 	chartInfo.EndDate = req.EndDate
-	chartInfo.SeasonStartDate = req.SeasonStartDate
-	chartInfo.SeasonEndDate = req.SeasonEndDate
+	chartInfo.SeasonStartDate = req.StartDate
+	chartInfo.SeasonEndDate = req.EndDate
 	chartInfo.LeftMin = req.LeftMin
 	chartInfo.LeftMax = req.LeftMax
 	chartInfo.RightMin = req.RightMin

+ 9 - 86
services/data/edb_data.go

@@ -212,12 +212,6 @@ func GetChartEdbSeasonalData(calendar, startDate, endDate string, edbInfo *data_
 	}
 
 	latestDateStr := edbInfo.LatestDate //实际数据的截止日期
-	latestDate, tmpErr := time.Parse(utils.FormatDate, edbInfo.LatestDate)
-	if tmpErr != nil {
-		err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + edbInfo.LatestDate))
-		return
-	}
-	latestDateYear := latestDate.Year() //实际数据截止年份
 
 	if calendar == "农历" {
 		if len(dataList) <= 0 {
@@ -228,90 +222,19 @@ func GetChartEdbSeasonalData(calendar, startDate, endDate string, edbInfo *data_
 				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
-			}
-
-			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...)
-				resultData = newResult
-			} else {
-				resultData = result
-			}
-		}
-
-	} else {
-		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)
+			quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, "", calendarPreYear)
+			if tErr != nil {
+				err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 				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
-			}
+			resultData = quarterDataList
 		}
-		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)
+	} else {
+		quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, "")
+		if tErr != nil {
+			err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+			return
 		}
 		resultData = quarterDataList
 	}

+ 1 - 1
services/data/line_equation/chart_info.go

@@ -142,7 +142,7 @@ func GetChartEdbData(chartInfoId int, lineChartInfoConfig request.LineChartInfoR
 	// 指标对应的所有数据
 	chartType := 1 //1:普通图,2:季节性图
 	calendar := "公历"
-	edbDataListMap, edbList, err := data.GetEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
+	edbDataListMap, edbList, err := data.GetEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, "")
 	if err != nil {
 		return
 	}

+ 5 - 5
services/data/line_feature/chart_info.go

@@ -19,7 +19,7 @@ func GetStandardDeviationData(chartInfoId int, startDate, endDate string, mappin
 	edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
 
 	// 指标对应的所有数据
-	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}
@@ -92,7 +92,7 @@ func GetPercentileData(chartInfoId int, startDate, endDate string, mappingInfo *
 	}
 	calculateDay := calculateValue * moveUnitDays
 	// 指标对应的所有数据
-	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}
@@ -184,7 +184,7 @@ func GetFrequencyDistributionData(chartInfoId int, mappingInfo *data_manage.Char
 	edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
 
 	// 指标对应的所有数据
-	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, err = data.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*data_manage.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}
@@ -434,8 +434,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.C
 	chartInfo.DateType = req.DateType
 	chartInfo.StartDate = req.StartDate
 	chartInfo.EndDate = req.EndDate
-	chartInfo.SeasonStartDate = req.SeasonStartDate
-	chartInfo.SeasonEndDate = req.SeasonEndDate
+	chartInfo.SeasonStartDate = req.StartDate
+	chartInfo.SeasonEndDate = req.EndDate
 	chartInfo.ChartImage = req.ChartImage
 	chartInfo.LeftMin = req.LeftMin
 	chartInfo.LeftMax = req.LeftMax

+ 9 - 87
services/data/predict_edb_info.go

@@ -1016,14 +1016,6 @@ func GetChartDataList(dataList []*data_manage.EdbDataList, chartType int, calend
 		return
 	}
 
-	//实际数据的截止日期
-	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 calendar == "农历" {
 		if len(dataList) <= 0 {
 			resultDataList = data_manage.EdbDataResult{}
@@ -1034,89 +1026,19 @@ func GetChartDataList(dataList []*data_manage.EdbDataList, chartType int, calend
 				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
-			}
-
-			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
+			quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, "", calendarPreYear)
+			if tErr != nil {
+				err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+				return
 			}
+			resultDataList = quarterDataList
 		}
 
 	} else {
-		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)
+		quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, "")
+		if tErr != nil {
+			err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+			return
 		}
 		resultDataList = quarterDataList
 	}

+ 12 - 89
services/data/supply_analysis/variety_edb.go

@@ -2,10 +2,11 @@ package supply_analysis
 
 import (
 	"errors"
-	"fmt"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/supply_analysis"
+	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"fmt"
 	"time"
 )
 
@@ -57,107 +58,29 @@ func GetChartEdbSeasonalData(varietyEdbId int, calendar, startDate, endDate, lat
 		return
 	}
 
-	//latestDateStr := edbInfo.LatestDate //实际数据的截止日期
-	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 calendar == "农历" {
 		if len(dataList) <= 0 {
 			resultData = new(data_manage.EdbDataResult)
 		} else {
+			// todo 额外处理
 			result, tmpErr := data_manage.AddCalculateQuarterV4(dataList)
 			if tmpErr != nil {
 				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
-			}
-
-			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...)
-				resultData = newResult
-			} else {
-				resultData = result
-			}
-		}
-
-	} else {
-		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)
+			quarterDataList, tErr := data.GetSeasonEdbInfoDataListByXDateNong(result, latestDateStr, "", calendarPreYear)
+			if tErr != nil {
+				err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 				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
-			}
+			resultData = quarterDataList
 		}
-		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)
+	} else {
+		quarterDataList, tErr := data.GetSeasonEdbInfoDataListByXDate(dataList, latestDateStr, "")
+		if tErr != nil {
+			err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+			return
 		}
 		resultData = quarterDataList
 	}

+ 62 - 0
utils/common.go

@@ -1593,6 +1593,7 @@ func GetLeadUnitEn(unit string) (unitEn string) {
 }
 
 // GetDateByDateType 通过dateType获取需要的开始/结束日期
+// dateType 日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今 20:最近N年
 func GetDateByDateType(dateType int, tmpStartDate, tmpEndDate string) (startDate, endDate string) {
 	startDate = tmpStartDate
 	endDate = tmpEndDate
@@ -1643,6 +1644,67 @@ func GetDateByDateType(dateType int, tmpStartDate, tmpEndDate string) (startDate
 	return
 }
 
+func GetDateByDateTypeV2(dateType int, tmpStartDate, tmpEndDate string, startYear, yearMax int) (startDate, endDate string) {
+	startDate = tmpStartDate
+	endDate = tmpEndDate
+	switch dateType {
+	case 1:
+		startDate = "2000-01-01"
+		endDate = ""
+	case 2:
+		startDate = "2010-01-01"
+		endDate = ""
+	case 3:
+		startDate = "2015-01-01"
+		endDate = ""
+	case 4:
+		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
+		startDate = "2021-01-01"
+		endDate = ""
+	case 5:
+		//startDate = startDate + "-01"
+		//endDate = endDate + "-01"
+	case 6:
+		//startDate = startDate + "-01"
+		endDate = ""
+	case 7:
+		startDate = "2018-01-01"
+		endDate = ""
+	case 8:
+		startDate = "2019-01-01"
+		endDate = ""
+	case 9:
+		startDate = "2020-01-01"
+		endDate = ""
+	case 11:
+		startDate = "2022-01-01"
+		endDate = ""
+	case DateTypeNYears:
+		if startYear == 0 { //默认取最近5年
+			startYear = 5
+		}
+		if yearMax == 0 {
+			return
+		}
+		startYear = startYear - 1
+		baseDate, _ := time.Parse(FormatDate, fmt.Sprintf("%d-01-01", yearMax))
+		startDate = baseDate.AddDate(-startYear, 0, 0).Format(FormatDate)
+		endDate = ""
+	}
+
+	// 兼容日期错误
+	{
+		if strings.Count(startDate, "-") == 1 {
+			startDate = startDate + "-01"
+		}
+		if strings.Count(endDate, "-") == 1 {
+			endDate = endDate + "-01"
+		}
+	}
+
+	return
+}
+
 func TimeTransferString(format string, t time.Time) string {
 	str := t.Format(format)
 	if t.IsZero() {

+ 3 - 0
utils/constants.go

@@ -13,6 +13,7 @@ const (
 	EmptyDateTimeStr           = "0000-00-00 00:00:00"     //DateTime零值字符串
 	EmptyDateStr               = "0000-00-00"              //Date零值字符串
 	FormatMonthDayUnSpace      = "0102"                    //日期格式
+	FormatMonthDay             = "01-02"                   //日期格式
 	FormatYearMonthDate        = "2006-01"                 //日期格式
 	FormatYearDate             = "2006"                    //日期格式
 	PageSize15                 = 15                        //列表页每页数据量
@@ -23,6 +24,8 @@ const (
 	PageSize50                 = 50
 )
 
+const DateTypeNYears = 20 //时间类型为最近N年
+
 // 手机号,电子邮箱正则
 const (
 	RegularMobile = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(16[0-9])|(19[0-9]))\\d{8}$" //手机号码