Browse Source

Merge branch 'feature/eta1.0.5' of hongze/hongze_yb into master

xyxie 1 năm trước cách đây
mục cha
commit
7169683bc5

+ 35 - 139
controller/chart/chart_info.go

@@ -48,14 +48,15 @@ func GetChartInfoDetail(c *gin.Context) {
 	}
 	chartInfoId, _ := strconv.Atoi(reqChartInfoId)
 
-	startDate := c.DefaultQuery("StartDate", "")
-	endDate := c.DefaultQuery("EndDate", "")
+	reqStartDate := c.DefaultQuery("StartDate", "")
+	reqEndDate := c.DefaultQuery("EndDate", "")
+
 	// 图表样式类型
 	reqChartType := c.DefaultQuery("ChartType", "")
 	chartType, _ := strconv.Atoi(reqChartType)
-	// 季节性图表时间
+	/*// 季节性图表时间
 	reqSeasonStartDate := c.DefaultQuery("SeasonStartDate", "")
-	reqSeasonEndDate := c.DefaultQuery("SeasonEndDate", "")
+	reqSeasonEndDate := c.DefaultQuery("SeasonEndDate", "")*/
 	// 指标ID
 	edbInfoId := c.DefaultQuery("EdbInfoId", "")
 	// 公历/农历
@@ -74,6 +75,9 @@ func GetChartInfoDetail(c *gin.Context) {
 		return
 	}
 	chartType = chartInfo.ChartType
+	startDate := chartInfo.StartDate
+	endDate := chartInfo.EndDate
+	startYear := chartInfo.StartYear
 	calendar := chartInfo.Calendar
 	if reqCalendar != "" {
 		calendar = reqCalendar
@@ -88,76 +92,12 @@ func GetChartInfoDetail(c *gin.Context) {
 	if dateType <= 0 {
 		dateType = 3 // 默认同后台15年至今
 	}
-
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-	case 2:
-		startDate = "2010-01-01"
-	case 3:
-		startDate = "2015-01-01"
-	case 4:
-		startDate = "2021-01-01"
-	case 5:
-		if startDate == "" && chartInfo.StartDate != "" {
-			startDate = chartInfo.StartDate
-			endDate = chartInfo.EndDate
-		}
-	case 6:
-		if startDate == "" && chartInfo.StartDate != "" {
-			startDate = chartInfo.StartDate
-		}
-	case 7:
-		startDate = "2018-01-01"
-	case 8:
-		startDate = "2019-01-01"
-	case 9:
-		startDate = "2020-01-01"
-	case 11:
-		startDate = "2022-01-01"
+	if reqStartDate != "" {
+		startDate = reqStartDate
 	}
-
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
+	if reqEndDate != "" {
+		endDate = reqEndDate
 	}
-
-	if chartType == 2 {
-		// 季节性图表
-		var seasonStartDate, seasonEndDate string
-		if reqSeasonStartDate == "" {
-			seasonStartDate = chartInfo.SeasonStartDate
-		} else {
-			seasonStartDate = reqSeasonStartDate
-		}
-		if reqSeasonEndDate == "" {
-			seasonEndDate = chartInfo.SeasonEndDate
-		} else {
-			seasonEndDate = reqSeasonEndDate
-		}
-		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 {
-				response.FailMsg("获取失败", "获取图表,指标信息失败,Err:"+tmpErr.Error(), c)
-				return
-			}
-			endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate)
-		} else {
-			endDate = time.Now().Format(utils.FormatDate)
-		}
-	}
-
 	// 获取图表指标映射
 	mappingList := make([]*chartEdbMappingModel.ChartEdbInfoMapping, 0)
 	if chartInfoId > 0 {
@@ -176,8 +116,15 @@ func GetChartInfoDetail(c *gin.Context) {
 		}
 	}
 
-	//fmt.Println("start_date:", startDate)
-	//fmt.Println("end_date:", endDate)
+	yearMax := 0
+	if dateType == utils.DateTypeNYears {
+		for _, v := range mappingList {
+			if v.LatestDate.Year() > yearMax {
+				yearMax = v.LatestDate.Year()
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 
 	// 图表额外数据参数
 	extraConfigStr := chartInfo.ExtraConfig
@@ -197,7 +144,7 @@ func GetChartInfoDetail(c *gin.Context) {
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, sourceArr, dataResp, err, errMsg := chart.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, sourceArr, dataResp, err, errMsg := chart.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
 	if err != nil {
 		msg := `获取失败`
 		if errMsg != `` {
@@ -275,74 +222,15 @@ func getChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myChartClassify
 	var err error
 	chartType := chartInfo.ChartType
 	calendar := chartInfo.Calendar
+	startDate := chartInfo.StartDate
+	endDate := chartInfo.EndDate
+	startYear := chartInfo.StartYear
 
 	// 时段筛选
 	dateType := chartInfo.DateType
 	if dateType <= 0 {
 		dateType = 3 // 默认同后台15年至今
 	}
-	var startDate, endDate string
-	switch dateType {
-	case 1:
-		startDate = "2000-01-01"
-	case 2:
-		startDate = "2010-01-01"
-	case 3:
-		startDate = "2015-01-01"
-	case 4:
-		startDate = "2021-01-01"
-	case 5:
-		if startDate == "" && chartInfo.StartDate != "" {
-			startDate = chartInfo.StartDate
-			endDate = chartInfo.EndDate
-		}
-	case 6:
-		if startDate == "" && chartInfo.StartDate != "" {
-			startDate = chartInfo.StartDate
-		}
-	case 7:
-		startDate = "2018-01-01"
-	case 8:
-		startDate = "2019-01-01"
-	case 9:
-		startDate = "2020-01-01"
-	case 11:
-		startDate = "2022-01-01"
-	}
-
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
-	}
-
-	if chartType == 2 {
-		// 季节性图表
-		var seasonStartDate, seasonEndDate string
-		seasonStartDate = chartInfo.SeasonStartDate
-		seasonEndDate = chartInfo.SeasonEndDate
-		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 := make([]*chartEdbMappingModel.ChartEdbInfoMapping, 0)
@@ -352,7 +240,15 @@ func getChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myChartClassify
 		errMsg = "获取图表指标信息失败4001, Err:" + err.Error()
 		return
 	}
-
+	yearMax := 0
+	if dateType == utils.DateTypeNYears {
+		for _, v := range mappingList {
+			if v.LatestDate.Year() > yearMax {
+				yearMax = v.LatestDate.Year()
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
 	//fmt.Println("start_date:", startDate)
 	//fmt.Println("end_date:", endDate)
 
@@ -376,7 +272,7 @@ func getChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myChartClassify
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, sourceArr, dataResp, err, tmpErrMsg := chart.GetChartEdbData(chartInfo.ChartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr)
+	edbList, xEdbIdValue, yDataList, sourceArr, dataResp, err, tmpErrMsg := chart.GetChartEdbData(chartInfo.ChartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig)
 	if err != nil {
 		msg = `获取失败`
 		if tmpErrMsg != `` {

+ 2 - 0
models/tables/chart_info/query.go

@@ -42,6 +42,8 @@ type ChartInfoView struct {
 	Source            int    `description:"1:ETA图库;2:商品价格"`
 	ExtraConfig       string `description:"图表额外配置,json数据"`
 	//ChartClassify     []*chart_classify.ChartClassifyView
+	SeasonExtraConfig string `description:"季节性图表中的配置,json数据"`
+	StartYear         int    `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
 }
 
 type SaveChartInfoReq struct {

+ 38 - 1
models/tables/edb_data/query.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/utils"
 	"strconv"
+	"time"
 )
 
 // 指标数据->存储表
@@ -179,9 +180,45 @@ type EdbDataResult struct {
 }
 
 type QuarterData struct {
-	Year                 int
+	Year                 string
 	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 SeasonExtraItem struct {
+	ChartLegend []SeasonChartLegend `description:"自定义的图例名称"`
+	XStartDate  string              `description:"横坐标显示的起始日"`
+	XEndDate    string              `description:"横坐标显示的截止日"`
+	JumpYear    int                 `description:"横坐标日期是否跨年,1跨年,0不跨年"`
+}
+
+type SeasonChartLegend struct {
+	Name  string
+	Value string
+}
+
+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]
 }
 
 // GetEdbDataList 获取指标数据

+ 454 - 85
services/chart/chart_info.go

@@ -59,7 +59,10 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
 			SET
             	edb_info_ids = ?,
 				modify_time = NOW(),
+				date_type = ?,
 				calendar = ?,
+				start_date = ?,
+				end_date = ?,
 				season_start_date = ?,
 				season_end_date = ?,
 				left_min = ?,
@@ -67,7 +70,7 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
 				right_min = ?,
 				right_max = ?,extra_config = ? 
 			WHERE chart_info_id = ?`
-		err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ExtraConfig, req.ChartInfoId).Error
+		err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.Calendar, req.StartDate, req.EndDate, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ExtraConfig, req.ChartInfoId).Error
 	}
 	if err != nil {
 		fmt.Println("UPDATE chart_info Err:", err.Error())
@@ -400,7 +403,7 @@ func RefreshChart(chartInfoId int) (err error) {
 }
 
 // GetChartEdbData 获取图表的指标数据
-func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, extraConfigStr string) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, xEdbIdValue []int, yDataList []chart_info.YData, sourceArr []string, dataResp interface{}, err error, errMsg string) {
+func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, xEdbIdValue []int, yDataList []chart_info.YData, sourceArr []string, dataResp interface{}, err error, errMsg string) {
 	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
 	xEdbIdValue = make([]int, 0)
 	yDataList = make([]chart_info.YData, 0)
@@ -438,7 +441,7 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	}
 
 	// 指标对应的所有数据
-	edbDataListMap, edbList, sourceArr, err := getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
+	edbDataListMap, edbList, sourceArr, err := getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
 	if err != nil {
 		return
 	}
@@ -473,13 +476,13 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 }
 
 // GetEdbDataMapList 获取指标最后的基础数据
-func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping) (edbDataListMap map[int][]*edbDataModel.EdbDataList, edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, sourceArr []string, err error) {
-	edbDataListMap, edbList, sourceArr, err = getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
+func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*edbDataModel.EdbDataList, edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, sourceArr []string, err error) {
+	edbDataListMap, edbList, sourceArr, err = getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
 	return
 }
 
 // getEdbDataMapList 获取指标最后的基础数据
-func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping) (edbDataListMap map[int][]*edbDataModel.EdbDataList, edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, sourceArr []string, err error) {
+func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*edbDataModel.EdbDataList, edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, sourceArr []string, err error) {
 	// 关联指标来源
 	sourceArr = make([]string, 0)
 	// 指标对应的所有数据
@@ -625,14 +628,8 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		}
 
 		if chartType == 2 {
-			latestDateStr := v.LatestDate.Format(utils.FormatDate) //实际数据的截止日期
+			//latestDateStr := v.LatestDate.Format(utils.FormatDate) //实际数据的截止日期
 			latestDate := v.LatestDate
-			//latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
-			//if tmpErr != nil {
-			//	err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
-			//	return
-			//}
-			latestDateYear := latestDate.Year() //实际数据截止年份
 
 			if calendar == "农历" {
 				if len(dataList) <= 0 {
@@ -644,101 +641,473 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 						return
 					}
+					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
+					if tErr != nil {
+						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+						return
+					}
+					item.DataList = quarterDataList
+				}
+
+			} else {
+				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
+				if tErr != nil {
+					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+					return
+				}
+				item.DataList = quarterDataList
+			}
+		} else if chartType == 7 { //柱方图
+			//item.DataList = dataList
+		} else {
+			item.DataList = dataList
+		}
+		edbList = append(edbList, item)
+	}
 
-					// 处理季节图的截止日期
-					for k, edbDataItems := range result.List {
-						var cuttingDataTimestamp int64
+	return
+}
 
-						// 切割的日期时间字符串
-						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
-					}
+// GetSeasonEdbInfoDataListByXDate 季节性图的指标数据根据横轴展示
+func GetSeasonEdbInfoDataListByXDate(dataList []*edbDataModel.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort edbDataModel.QuarterDataList, err error) {
+	xStartDate := "01-01"
+	xEndDate := "12-31"
+	jumpYear := 0
+	legends := make([]edbDataModel.SeasonChartLegend, 0)
+	var seasonExtra edbDataModel.SeasonExtraItem
+	if seasonExtraConfig != "" {
+		err = json.Unmarshal([]byte(seasonExtraConfig), &seasonExtra)
+		if err != nil {
+			return
+		}
+	}
 
-					if result.List[0].Year != calendarPreYear {
-						itemList := make([]*edbDataModel.EdbDataList, 0)
-						items := new(edbDataModel.EdbDataItems)
-						//items.Year = calendarPreYear
-						items.Items = itemList
+	if seasonExtra.XStartDate != "" {
+		xStartDate = seasonExtra.XStartDate
+		xEndDate = seasonExtra.XEndDate
+		jumpYear = seasonExtra.JumpYear
+		legends = seasonExtra.ChartLegend
+	}
 
-						newResult := new(edbDataModel.EdbDataResult)
-						newResult.List = append(newResult.List, items)
-						newResult.List = append(newResult.List, result.List...)
-						item.DataList = newResult
+	length := len(dataList)
+	if length == 0 {
+		return
+	}
+	legendMap := make(map[string]string, 0)
+	if len(legends) > 0 {
+		for _, v := range legends {
+			legendMap[v.Name] = v.Value
+		}
+	}
+	latestDateStr := latestDate.Format(utils.FormatDate)
+
+	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
+	//根据数据确定最早的年份,和最近年份
+	//根据横轴的日期,汇总所有的年份
+	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 := lastDateT.Year()
+	nowYear := time.Now().Year()
+	dataMap := make(map[string]edbDataModel.QuarterXDateItem, 0)
+
+	quarterDataList := make([]*edbDataModel.QuarterData, 0)
+	quarterMap := make(map[string][]*edbDataModel.EdbDataList, 0)
+
+	//整理出日期
+	idx := 1
+	chartLegendMap := make(map[string]int, 0)
+	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 endT.Year() > nowYear {
+			//如果最新的日期比真实年份要大,则数据全部按照最大的年份补齐
+			nowYear = endT.Year()
+		}
+		item := edbDataModel.QuarterXDateItem{
+			StartDate: startT,
+			EndDate:   endT,
+			ShowName:  showName,
+		}
+		dataMap[name] = item
+		chartLegendMap[name] = idx
+		idx++
+		if lastDateT.Before(endT) {
+			//如果最新的日期在起始日之前,则跳出循环
+			break
+		}
+	}
+	lenYear := len(dataMap)
+	for k, v := range dataMap {
+		if i, ok := chartLegendMap[k]; ok {
+			v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+		}
+		dataMap[k] = v
+	}
+
+	for _, v := range dataList {
+		dataTimeT, _ := time.Parse(utils.FormatDate, v.DataTime)
+		year := dataTimeT.Year()
+		newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+		for k, dateItem := range dataMap {
+			tmpVal := edbDataModel.EdbDataList{
+				EdbDataId:     v.EdbDataId,
+				EdbInfoId:     v.EdbInfoId,
+				DataTime:      v.DataTime,
+				DataTimestamp: v.DataTimestamp,
+				Value:         v.Value,
+			}
+			if (dateItem.StartDate.Before(dataTimeT) && dateItem.EndDate.After(dataTimeT)) || dateItem.StartDate == dataTimeT || dateItem.EndDate == dataTimeT {
+				if jumpYear == 1 {
+					//计算前一年最大的日期, 只补齐数据到去年
+					beforeYearMaxDate := fmt.Sprintf("%d-12-31", dateItem.StartDate.Year())
+					beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+					if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
+						newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
 					} else {
-						item.DataList = result
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
 					}
+				} else {
+					newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+				}
+				timestamp := newItemDate.UnixNano() / 1e6
+				tmpVal.DataTimestamp = timestamp
+				tmpV := &tmpVal
+				if findVal, ok := quarterMap[k]; !ok {
+					findVal = append(findVal, tmpV)
+					quarterMap[k] = findVal
+				} else {
+					findVal = append(findVal, tmpV)
+					quarterMap[k] = findVal
 				}
 
-			} else {
-				currentYear := time.Now().Year()
+				if v.DataTime == latestDateStr {
+					dateItem.CuttingDataTimestamp = timestamp
+					dataMap[k] = dateItem
+				}
+				//break
+			}
+		}
+	}
+	for k, v := range dataMap {
+		itemList := quarterMap[k]
+		quarterItem := new(edbDataModel.QuarterData)
+		quarterItem.Years = v.ShowName
+		quarterItem.Year = v.ChartLegend
+		quarterItem.ChartLegend = v.ChartLegend
+		if le, ok := legendMap[v.ShowName]; ok {
+			if le != strconv.Itoa(v.StartDate.Year()) && le != strconv.Itoa(v.EndDate.Year()) {
+				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)
+	}
 
-				quarterDataList := make([]*edbDataModel.QuarterData, 0)
-				quarterMap := make(map[int][]*edbDataModel.EdbDataList)
-				var quarterArr []int
+	if len(quarterDataList) > 0 {
+		quarterDataListSort = quarterDataList
+		sort.Sort(quarterDataListSort)
+	}
+	return
+}
 
-				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
+// GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
+// GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
+func GetSeasonEdbInfoDataListByXDateNong(result *edbDataModel.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort edbDataModel.QuarterDataList, err error) {
+	xStartDate := "01-01"
+	xEndDate := "12-31"
+	jumpYear := 0
+	legends := make([]edbDataModel.SeasonChartLegend, 0)
+	var seasonExtra edbDataModel.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, 0)
+	if len(legends) > 0 {
+		for _, v := range legends {
+			legendMap[v.Name] = v.Value
+		}
+	}
+	latestDateYear := latestDate.Year()
+	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
+	//根据数据确定最早的年份,和最近年份
+	//根据横轴的日期,汇总所有的年份
+	startYear := result.List[0].Year
+	/*if jumpYear == 1 {
+		if startYear != calendarPreYear {
+			startYear = startYear - 1
+		}
+	}*/
+	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 := lastDateT.Year()
+	nowYear := time.Now().Year()
+	dataMap := make(map[string]edbDataModel.QuarterXDateItem, 0)
+
+	quarterDataList := make([]*edbDataModel.QuarterData, 0)
+	resultData := make([]*edbDataModel.QuarterData, 0)
+	quarterMap := make(map[string][]*edbDataModel.EdbDataList, 0)
+
+	//整理出日期
+	idx := 1
+	chartLegendMap := make(map[string]int, 0)
+	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 endT.Year() > nowYear {
+			//如果最新的日期比真实年份要大,则数据全部按照最大的年份补齐
+			nowYear = endT.Year()
+		}
+		item := edbDataModel.QuarterXDateItem{
+			StartDate: startT,
+			EndDate:   endT,
+			ShowName:  showName,
+		}
+		dataMap[showName] = item
+		chartLegendMap[showName] = idx
+		idx++
+		if lastDateT.Before(endT) {
+			//如果最新的日期在起始日之前,则跳出循环
+			break
+		}
+	}
+	lenYear := len(dataMap)
+	for k, v := range dataMap {
+		if i, ok := chartLegendMap[k]; ok {
+			v.ChartLegend = strconv.Itoa(endYear - lenYear + i)
+		}
+		dataMap[k] = v
+	}
+
+	yearDataListMap := make(map[int]*edbDataModel.EdbDataItems, 0)
+
+	for _, lv := range result.List {
+		yearDataListMap[lv.Year] = lv
+	}
+
+	//判断哪些点应该落在同一条时间线上
+	maxY := lastDateT.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 name, dateItem := range dataMap {
+		lv, ok1 := yearDataListMap[dateItem.EndDate.Year()]
+		if dateItem.EndDate.Year() > lastDateT.Year() {
+			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
+		}
+		if !ok1 {
+			continue
+		}
+		for _, item := range lv.Items {
+			tmpVal := edbDataModel.EdbDataList{
+				EdbDataId:     item.EdbDataId,
+				EdbInfoId:     item.EdbInfoId,
+				DataTime:      item.DataTime,
+				DataTimestamp: item.DataTimestamp,
+				Value:         item.Value,
+			}
+			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
+			year := dataTimeT.Year()
+			newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+			if dateItem.EndDate.Year() > maxY {
+				if (dateItem.StartDate.Before(dataTimeT) && dateItem.EndDate.After(dataTimeT)) || dateItem.StartDate == dataTimeT || dateItem.EndDate == dataTimeT {
+					if jumpYear == 1 {
+						//计算前一年最大的日期, 只补齐数据到去年
+						beforeYearMaxDate := fmt.Sprintf("%d-12-31", dateItem.StartDate.Year())
+						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
+							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
+						} else {
+							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+						}
+					} else {
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
 					}
-					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
+					tmpVal.DataTimestamp = timestamp
+					tmpV := &tmpVal
+					if findVal, ok := quarterMap[name]; !ok {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
 					} else {
-						findVal = append(findVal, v)
-						quarterMap[year] = findVal
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					}
+					if lv.Year >= latestDateYear {
+						// 切割的日期时间字符串
+						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
+						if item.DataTime == cuttingDataTimeStr {
+							dateItem.CuttingDataTimestamp = timestamp
+							dataMap[name] = dateItem
+						}
 					}
 				}
-				for _, v := range quarterArr {
-					itemList := quarterMap[v]
-					quarterItem := new(edbDataModel.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
-							}
+			} else {
+				if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
+					if jumpYear == 1 {
+						//计算前一年最大的日期, 只补齐数据到去年
+						beforeYearMaxDate := fmt.Sprintf("%d-12-31", startTmpT.Year())
+						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
+						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
+							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
+						} else {
+							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
 						}
-						quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
-					} else if v > latestDateYear {
-						//如果大于最后的实际日期,那么第一个点就是切割的时间戳
-						if len(itemList) > 0 {
-							quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
+					} else {
+						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
+					}
+					timestamp := newItemDate.UnixNano() / 1e6
+					tmpVal.DataTimestamp = timestamp
+					tmpV := &tmpVal
+					if findVal, ok := quarterMap[name]; !ok {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					} else {
+						findVal = append(findVal, tmpV)
+						quarterMap[name] = findVal
+					}
+					if lv.Year >= latestDateYear {
+						// 切割的日期时间字符串
+						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
+						if item.DataTime == cuttingDataTimeStr {
+							dateItem.CuttingDataTimestamp = timestamp
+							dataMap[name] = dateItem
 						}
 					}
-					quarterDataList = append(quarterDataList, quarterItem)
 				}
-				item.DataList = quarterDataList
 			}
-		} else if chartType == 7 { //柱方图
-			//item.DataList = dataList
-		} else {
-			item.DataList = dataList
 		}
-		edbList = append(edbList, item)
+
 	}
+	for k, v := range dataMap {
+		itemList := quarterMap[k]
+		quarterItem := new(edbDataModel.QuarterData)
+		quarterItem.Years = v.ShowName
+		quarterItem.Year = v.ChartLegend
+		quarterItem.ChartLegend = v.ChartLegend
+		if le, ok := legendMap[v.ShowName]; ok {
+			if le != strconv.Itoa(v.StartDate.Year()) && le != strconv.Itoa(v.EndDate.Year()) {
+				quarterItem.ChartLegend = le
+			}
+		}
+		quarterItem.DataList = itemList
+		quarterItem.CuttingDataTimestamp = v.CuttingDataTimestamp
+
+		quarterDataList = append(quarterDataList, quarterItem)
+	}
+
+	if result.List[0].Year != calendarPreYear {
+		itemList := make([]*edbDataModel.EdbDataList, 0)
+		items := new(edbDataModel.QuarterData)
+		//items.Year = calendarPreYear
+		items.DataList = itemList
 
+		newResult := make([]*edbDataModel.QuarterData, 0)
+		newResult = append(newResult, items)
+		newResult = append(newResult, quarterDataList...)
+		resultData = newResult
+	} else {
+		resultData = quarterDataList
+	}
+
+	if len(quarterDataList) > 0 {
+		quarterDataListSort = resultData
+		sort.Sort(quarterDataListSort)
+	}
 	return
 }
 

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

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

+ 3 - 3
services/chart/line_feature/chart_info.go

@@ -60,7 +60,7 @@ func GetStandardDeviationData(chartInfoId int, startDate, endDate string, mappin
 	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
 
 	// 指标对应的所有数据
-	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}
@@ -133,7 +133,7 @@ func GetPercentileData(chartInfoId int, startDate, endDate string, mappingInfo *
 	}
 	calculateDay := calculateValue * moveUnitDays
 	// 指标对应的所有数据
-	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}
@@ -225,7 +225,7 @@ func GetFrequencyDistributionData(chartInfoId int, mappingInfo *chartEdbMappingM
 	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
 
 	// 指标对应的所有数据
-	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo}, "")
 	if err != nil {
 		return
 	}

+ 61 - 0
utils/common.go

@@ -1369,3 +1369,64 @@ func removeDecimalPoint(str string) string {
 	str = str[strings.Index(str, ".")+1:]
 	return str
 }
+
+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
+}

+ 2 - 0
utils/constants.go

@@ -16,6 +16,8 @@ const (
 	PageSize30            = 30
 )
 
+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}$" //手机号码