Browse Source

Merge remote-tracking branch 'origin/master'

Roc 7 months ago
parent
commit
40b45c1fda

+ 51 - 48
controllers/data_manage/chart_info.go

@@ -1433,30 +1433,8 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 			return
 		}
 		for i := range markerLines {
-			if markerLines[i].EdbType == 1 {
-				// 指标计算
-				edbInfo, err := data_manage.GetEdbInfoById(markerLines[i].EdbInfoId)
-				if err != nil {
-					br.Msg = "指标计算标识线获取指标信息异常"
-					br.ErrMsg = "指标计算标识线获取指标信息异常" + err.Error()
-					return
-				}
-				dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, markerLines[i].StartDate.Date, markerLines[i].EndDate.Date)
-				if err != nil {
-					br.Msg = "指标计算标识线获取指标数据异常"
-					br.ErrMsg = "指标计算标识线获取指标数据异常" + err.Error()
-					return
-				}
-				value, err := data.MarkerLineCalculate(markerLines[i], dataList, chartInfo)
-				if err != nil {
-					br.Msg = "标识线配置异常"
-					br.ErrMsg = "标识线配置异常" + err.Error()
-					return
-				}
-				markerLines[i].Value = value
-
-			} else {
-				// 跟随图表
+			if markerLines[i].EdbType == 0 && markerLines[i].TimeIntervalType == 0 {
+				// 图上第一个指标且时间区间跟随图表
 				if edbList[0].IsAxis == 1 {
 					value, err := data.MarkerLineCalculate(markerLines[i], edbList[0].DataList, chartInfo)
 					if err != nil {
@@ -1465,6 +1443,32 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 						return
 					}
 					markerLines[i].Value = value
+				} else {
+					// 其他的都走指标计算
+					edbInfo, err := data_manage.GetEdbInfoById(markerLines[i].EdbInfoId)
+					if err != nil {
+						br.Msg = "指标计算标识线获取指标信息异常"
+						br.ErrMsg = "指标计算标识线获取指标信息异常" + err.Error()
+						return
+					}
+					// 判断时间区间不为跟随图表的情况
+					if markerLines[i].TimeIntervalType != 0 {
+						startDate = markerLines[i].StartDate.Date
+						endDate = markerLines[i].EndDate.Date
+					}
+					dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, startDate, endDate)
+					if err != nil {
+						br.Msg = "指标计算标识线获取指标数据异常"
+						br.ErrMsg = "指标计算标识线获取指标数据异常" + err.Error()
+						return
+					}
+					value, err := data.MarkerLineCalculate(markerLines[i], dataList, chartInfo)
+					if err != nil {
+						br.Msg = "标识线配置异常"
+						br.ErrMsg = "标识线配置异常" + err.Error()
+						return
+					}
+					markerLines[i].Value = value
 				}
 			}
 		}
@@ -3388,30 +3392,8 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 			return
 		}
 		for i := range markerLines {
-			if markerLines[i].EdbType == 1 {
-				// 指标计算
-				edbInfo, err := data_manage.GetEdbInfoById(markerLines[i].EdbInfoId)
-				if err != nil {
-					br.Msg = "指标计算标识线获取指标信息异常"
-					br.ErrMsg = "指标计算标识线获取指标信息异常" + err.Error()
-					return
-				}
-				dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, markerLines[i].StartDate.Date, markerLines[i].EndDate.Date)
-				if err != nil {
-					br.Msg = "指标计算标识线获取指标数据异常"
-					br.ErrMsg = "指标计算标识线获取指标数据异常" + err.Error()
-					return
-				}
-				value, err := data.MarkerLineCalculate(markerLines[i], dataList, chartInfo)
-				if err != nil {
-					br.Msg = "标识线配置异常"
-					br.ErrMsg = "标识线配置异常" + err.Error()
-					return
-				}
-				markerLines[i].Value = value
-
-			} else {
-				// 跟随图表
+			if markerLines[i].EdbType == 0 && markerLines[i].TimeIntervalType == 0 {
+				// 图上第一个指标且时间区间跟随图表
 				if edbList[0].IsAxis == 1 {
 					value, err := data.MarkerLineCalculate(markerLines[i], edbList[0].DataList, chartInfo)
 					if err != nil {
@@ -3420,6 +3402,27 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 						return
 					}
 					markerLines[i].Value = value
+				} else {
+					// 其他的都走指标计算
+					edbInfo, err := data_manage.GetEdbInfoById(markerLines[i].EdbInfoId)
+					if err != nil {
+						br.Msg = "指标计算标识线获取指标信息异常"
+						br.ErrMsg = "指标计算标识线获取指标信息异常" + err.Error()
+						return
+					}
+					dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, "", "")
+					if err != nil {
+						br.Msg = "指标计算标识线获取指标数据异常"
+						br.ErrMsg = "指标计算标识线获取指标数据异常" + err.Error()
+						return
+					}
+					value, err := data.MarkerLineCalculate(markerLines[i], dataList, chartInfo)
+					if err != nil {
+						br.Msg = "标识线配置异常"
+						br.ErrMsg = "标识线配置异常" + err.Error()
+						return
+					}
+					markerLines[i].Value = value
 				}
 			}
 		}

+ 8 - 8
models/data_manage/chart_info.go

@@ -297,18 +297,18 @@ type MarkersLineTime struct {
 // EdbDateExtraConf
 // @Description: 导入指标日期前移和日期变换
 type EdbDateChangeConf struct {
-	MoveForward int `description:"前移的期数"`
-	BaseDate    int `description:"基准日期 0系统日期 1指标最新日期"`
+	MoveForward int `json:"moveForward" description:"前移的期数"`
+	BaseDate    int `json:"baseDate" description:"基准日期 0系统日期 1指标最新日期"`
 	DateChange  []*EdbDateConfDateChange
 }
 
 type EdbDateConfDateChange struct {
-	Year         int
-	Month        int
-	Day          int
-	Frequency    string `description:"频度变换"`
-	FrequencyDay string `description:"频度的固定日期"`
-	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
+	Year         int    `json:"year" description:"前移的期数"`
+	Month        int    `json:"month" description:"前移的期数"`
+	Day          int    `json:"day" description:"前移的期数"`
+	Frequency    string `json:"moveForward" description:"频度变换"`
+	FrequencyDay string `json:"frequencyDay" description:"频度的固定日期"`
+	ChangeType   int    `json:"changeType" description:"日期变换类型1日期位移,2指定频率"`
 }
 
 type EditChartEnInfoReq struct {

+ 400 - 39
services/data/chart_info.go

@@ -359,7 +359,16 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -2915,7 +2924,16 @@ func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, end
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -3275,7 +3293,16 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -3337,9 +3364,14 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 		if mappingItem.IsAxis == 0 {
 			continue
 		}
-		quarterDataList := mappingItem.DataList.(data_manage.QuarterDataList)
+		quarterDataList, ok := mappingItem.DataList.(data_manage.QuarterDataList)
+		if !ok {
+			continue
+		}
 		// 上下限区间
 		if seasonConfig.MaxMinLimits.Year > 0 {
+			yearRange := time.Now().Year() - seasonConfig.MaxMinLimits.Year
+			startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
 			dataResp.MaxMinLimits.List = make([]*data_manage.MaxMinLimitsData, 0)
 			dataTimeMap := make(map[time.Time]time.Time)
 			dataTimeList := make([]string, 0)
@@ -3347,6 +3379,22 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			minValueMap := make(map[time.Time]float64)
 
 			maxMinDataList := make([]*data_manage.MaxMinLimitsData, 0)
+			var startDateStr string
+			var endDateStr string
+			var newDate time.Time
+
+			startDateStr = fmt.Sprintf("%d-%s", time.Now().Year(), seasonConfig.XStartDate)
+			endDateStr = fmt.Sprintf("%d-%s", time.Now().Year(), seasonConfig.XEndDate)
+			startDate, e := time.Parse(utils.FormatDate, startDateStr)
+			if e != nil {
+				err = e
+				return
+			}
+			endDate, e := time.Parse(utils.FormatDate, endDateStr)
+			if e != nil {
+				err = e
+				return
+			}
 			// 日度 周度插值
 			for _, v := range quarterDataList {
 				if mappingItem.Frequency == "日度" || mappingItem.Frequency == "周度" {
@@ -3356,35 +3404,123 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("插值处理数据异常, Err:" + err.Error())
 						return
 					}
+					// 不包含当年
+					if v.ChartLegend == strconv.Itoa(time.Now().Year()) {
+						continue
+					}
 					for _, date := range dataTimeList {
 						dateTime, e := time.Parse(utils.FormatDate, date)
 						if e != nil {
 							err = errors.New("时间格式化异常, Err:" + e.Error())
 							return
 						}
-						// 不包含今年
-						if dateTime.Year() == time.Now().Year() {
+						if dateTime.Year() < startYear {
 							continue
 						}
-						newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
-						// 处理上下限列表
-						if value, ok := maxValueMap[newDate]; ok {
-							if value < handleDataMap[date] {
-								maxValueMap[newDate] = handleDataMap[date]
+						// 不包含2月29号
+						if dateTime.Month() == 2 && dateTime.Day() == 29 {
+							continue
+						}
+						newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
+						if seasonConfig.JumpYear == 1 {
+							if startDate.After(endDate) {
+								// 如果跨年且不到一年
+								// 全年截取一部分
+								if newDate.Before(startDate.AddDate(0, 0, 1)) && newDate.After(endDate) {
+									continue
+								}
+								if newDate.After(startDate.AddDate(0, 0, -1)) {
+									// 减一年
+									newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()-1, 0, 0)
+								}
+								// 处理上下限列表
+								if value, ok := maxValueMap[newDate]; ok {
+									if value < handleDataMap[date] {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+								} else {
+									maxValueMap[newDate] = handleDataMap[date]
+								}
+
+								if value, ok := minValueMap[newDate]; ok {
+									if value > handleDataMap[date] {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+								} else {
+									minValueMap[newDate] = handleDataMap[date]
+								}
+
+								dataTimeMap[newDate] = newDate
+							} else {
+								// 如果跨年且大于等于一年
+								// double后截取
+								if newDate.After(startDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < handleDataMap[date] {
+											maxValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > handleDataMap[date] {
+											minValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
+								newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()+1, 0, 0)
+								newEndDate := endDate.AddDate(1, 0, 0)
+								if newDate.Before(newEndDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < handleDataMap[date] {
+											maxValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > handleDataMap[date] {
+											minValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
 							}
 						} else {
-							maxValueMap[newDate] = handleDataMap[date]
-						}
+							// 如果不跨年 正常获取
+							// 获取当前日期所在区间
+							// 处理上下限列表
+							if value, ok := maxValueMap[newDate]; ok {
+								if value < handleDataMap[date] {
+									maxValueMap[newDate] = handleDataMap[date]
+								}
+							} else {
+								maxValueMap[newDate] = handleDataMap[date]
+							}
 
-						if value, ok := minValueMap[newDate]; ok {
-							if value > handleDataMap[date] {
+							if value, ok := minValueMap[newDate]; ok {
+								if value > handleDataMap[date] {
+									minValueMap[newDate] = handleDataMap[date]
+								}
+							} else {
 								minValueMap[newDate] = handleDataMap[date]
 							}
-						} else {
-							minValueMap[newDate] = handleDataMap[date]
-						}
 
-						dataTimeMap[newDate] = newDate
+							dataTimeMap[newDate] = newDate
+						}
 					}
 				} else {
 					// 旬度、月度、季度、半年度 不插值,需要先把日期列表和数据map取出来
@@ -3394,28 +3530,120 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 							err = errors.New("时间格式化异常, Err:" + e.Error())
 							return
 						}
-						// 不包含今年
-						if dateTime.Year() == time.Now().Year() {
+
+						// 不包含当年
+						if v.ChartLegend == strconv.Itoa(time.Now().Year()) {
 							continue
 						}
-						newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 
-						if value, ok := maxValueMap[newDate]; ok {
-							if value < vv.Value {
-								maxValueMap[newDate] = vv.Value
+						if dateTime.Year() < startYear {
+							continue
+						}
+						// 不包含2月29号
+						if dateTime.Month() == 2 && dateTime.Day() == 29 {
+							continue
+						}
+						newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
+						if seasonConfig.JumpYear == 1 {
+							if startDate.After(endDate) {
+								// 如果跨年且不到一年
+								// 全年截取一部分
+								if newDate.Before(startDate.AddDate(0, 0, 1)) && newDate.After(endDate) {
+									continue
+								}
+								if newDate.After(startDate.AddDate(0, 0, -1)) {
+									// 减一年
+									newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()-1, 0, 0)
+								}
+								// 处理上下限列表
+								if value, ok := maxValueMap[newDate]; ok {
+									if value < vv.Value {
+										maxValueMap[newDate] = vv.Value
+									}
+								} else {
+									maxValueMap[newDate] = vv.Value
+								}
+
+								if value, ok := minValueMap[newDate]; ok {
+									if value > vv.Value {
+										minValueMap[newDate] = vv.Value
+									}
+								} else {
+									minValueMap[newDate] = vv.Value
+								}
+
+								dataTimeMap[newDate] = newDate
+							} else {
+								// 如果跨年且大于等于一年
+								// double后截取
+								if newDate.After(startDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < vv.Value {
+											maxValueMap[newDate] = vv.Value
+										}
+									} else {
+										maxValueMap[newDate] = vv.Value
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > vv.Value {
+											minValueMap[newDate] = vv.Value
+										}
+									} else {
+										minValueMap[newDate] = vv.Value
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
+								newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()+1, 0, 0)
+								newEndDate := endDate.AddDate(1, 0, 0)
+								if newDate.Before(newEndDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < vv.Value {
+											maxValueMap[newDate] = vv.Value
+										}
+									} else {
+										maxValueMap[newDate] = vv.Value
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > vv.Value {
+											minValueMap[newDate] = vv.Value
+										}
+									} else {
+										minValueMap[newDate] = vv.Value
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
 							}
 						} else {
-							maxValueMap[newDate] = vv.Value
-						}
+							// 如果不跨年 正常获取
+							// 获取当前日期所在区间
+							// 处理上下限列表
+							if value, ok := maxValueMap[newDate]; ok {
+								if value < vv.Value {
+									maxValueMap[newDate] = vv.Value
+								}
+							} else {
+								maxValueMap[newDate] = vv.Value
+							}
 
-						if value, ok := minValueMap[newDate]; ok {
-							if value > vv.Value {
+							if value, ok := minValueMap[newDate]; ok {
+								if value > vv.Value {
+									minValueMap[newDate] = vv.Value
+								}
+							} else {
 								minValueMap[newDate] = vv.Value
 							}
-						} else {
-							minValueMap[newDate] = vv.Value
+
+							dataTimeMap[newDate] = newDate
 						}
-						dataTimeMap[newDate] = newDate
+
 					}
 				}
 			}
@@ -3433,6 +3661,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 				} else {
 					maxMinItem.MinValue = maxValueMap[v]
 				}
+
 				maxMinItem.DataTime = v.Format(utils.FormatDate)
 				maxMinItem.DataTimestamp = v.UnixNano() / 1e6
 
@@ -3459,7 +3688,6 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			dataTimeMap := make(map[time.Time]time.Time)
 			dataTimeList := make([]string, 0)
 			valueMap := make(map[time.Time]float64)
-
 			averageDataList := make([]*data_manage.SamePeriodAverageData, 0)
 			for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year && i > 0; i-- {
 				// 插值成日度
@@ -3474,6 +3702,15 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("时间格式化异常, Err:" + e.Error())
 						return
 					}
+					yearRange := time.Now().Year() - seasonConfig.SamePeriodAverage.Year
+					startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
+					if dateTime.Year() < startYear {
+						continue
+					}
+					// 不包含2月29号
+					if dateTime.Month() == 2 && dateTime.Day() == 29 {
+						continue
+					}
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
@@ -3516,6 +3753,9 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 
 		// 自定义同期标准差
 		if seasonConfig.SamePeriodStandardDeviation.Year > 1 && seasonConfig.SamePeriodStandardDeviation.Multiple > 0 {
+			yearRange := time.Now().Year() - seasonConfig.SamePeriodAverage.Year
+			startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
+
 			// 先算均值,再算标准差
 			handleDataMap := make(map[string]float64)
 			dataTimeMap := make(map[time.Time]time.Time)
@@ -3537,6 +3777,13 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("时间格式化异常, Err:" + e.Error())
 						return
 					}
+					if dateTime.Year() < startYear {
+						continue
+					}
+					// 不包含2月29号
+					if dateTime.Month() == 2 && dateTime.Day() == 29 {
+						continue
+					}
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
@@ -3676,11 +3923,11 @@ func MarkerLineCalculate(markerLine data_manage.MarkersLine, dataList interface{
 						}
 						if vv.DataTime >= startDate && vv.DataTime <= endDate {
 							averge += vv.Value
-							length +=1
+							length += 1
 						}
 					} else {
 						averge += vv.Value
-						length +=1
+						length += 1
 					}
 				}
 				averge = averge / float64(length)
@@ -3881,7 +4128,7 @@ func MarkerLineCalculate(markerLine data_manage.MarkersLine, dataList interface{
 						faloatList = append(faloatList, vv.Value)
 					}
 				}
-
+				sort.Float64s(faloatList)
 				markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, faloatList)
 				value = fmt.Sprintf("%.2f", markerLineValue)
 			}
@@ -3925,10 +4172,120 @@ func MarkerLineCalculate(markerLine data_manage.MarkersLine, dataList interface{
 					floatList = append(floatList, dataItem.Value)
 				}
 			}
-
+			sort.Float64s(floatList)
 			markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, floatList)
 			value = fmt.Sprintf("%.2f", markerLineValue)
 		}
+	} else if markerLine.Calculation == 4 {
+		// 数值分位
+		markerLineValue := 0.0
+		maxValue := 0.0
+		minValue := 0.0
+		if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
+			//季节性图结构体不一样
+			quarterDataList := dataList.(data_manage.QuarterDataList)
+			for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
+				for _, vv := range quarterData.DataList {
+					if markerLine.TimeIntervalType == 1 {
+						startDate := markerLine.StartDate.Date
+						endDate := time.Now().Format(utils.FormatDate)
+						if markerLine.StartDate.TimeType == 2 {
+							// 动态
+							if markerLine.StartDate.Conf.BaseDate == 1 {
+								// 指标最新日期
+								startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
+							} else {
+								// 系统日期
+								startDate = time.Now().Format(utils.FormatDate)
+							}
+							startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
+						}
+						if markerLine.EndDate.TimeType == 1 {
+							// 固定
+							endDate = markerLine.EndDate.Date
+						} else if markerLine.EndDate.TimeType == 2 {
+							// 动态
+							if markerLine.StartDate.Conf.BaseDate == 1 {
+								// 指标最新日期
+								endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
+							} else {
+								// 系统日期
+								endDate = time.Now().Format(utils.FormatDate)
+							}
+							endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
+						}
+						if vv.DataTime >= startDate && vv.DataTime <= endDate {
+							if maxValue < vv.Value {
+								maxValue = vv.Value
+							}
+							if minValue > vv.Value {
+								minValue = vv.Value
+							}
+						}
+					} else {
+						if maxValue < vv.Value {
+							maxValue = vv.Value
+						}
+						if minValue > vv.Value {
+							minValue = vv.Value
+						}
+					}
+				}
+				markerLineValue = CalculatePercentile(markerLine.CalculationValue, minValue, maxValue)
+				value = fmt.Sprintf("%.2f", markerLineValue)
+			}
+
+		} else {
+			dataList := dataList.([]*data_manage.EdbDataList)
+			for _, dataItem := range dataList {
+				if markerLine.TimeIntervalType == 1 {
+					startDate := markerLine.StartDate.Date
+					endDate := time.Now().Format(utils.FormatDate)
+					if markerLine.StartDate.TimeType == 2 {
+						// 动态
+						if markerLine.StartDate.Conf.BaseDate == 1 {
+							// 指标最新日期
+							startDate = dataList[len(dataList)-1].DataTime
+						} else {
+							// 系统日期
+							startDate = time.Now().Format(utils.FormatDate)
+						}
+						startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
+					}
+					if markerLine.EndDate.TimeType == 1 {
+						// 固定
+						endDate = markerLine.EndDate.Date
+					} else if markerLine.EndDate.TimeType == 2 {
+						// 动态
+						if markerLine.StartDate.Conf.BaseDate == 1 {
+							// 指标最新日期
+							endDate = dataList[len(dataList)-1].DataTime
+						} else {
+							// 系统日期
+							endDate = time.Now().Format(utils.FormatDate)
+						}
+						endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
+					}
+					if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
+						if maxValue < dataItem.Value {
+							maxValue = dataItem.Value
+						}
+						if minValue > dataItem.Value {
+							minValue = dataItem.Value
+						}
+					}
+				} else {
+					if maxValue < dataItem.Value {
+						maxValue = dataItem.Value
+					}
+					if minValue > dataItem.Value {
+						minValue = dataItem.Value
+					}
+				}
+			}
+			markerLineValue = CalculatePercentile(markerLine.CalculationValue, minValue, maxValue)
+			value = fmt.Sprintf("%.2f", markerLineValue)
+		}
 	}
 	return
 }
@@ -3966,7 +4323,6 @@ func HandleDateChange(date string, edbDateConf data_manage.EdbDateChangeConf) (n
 	return
 }
 
-
 // handleSystemAppointDateT
 // @Description: 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
 // @author: Roc
@@ -4094,4 +4450,9 @@ func handleSystemAppointDateT2(currDate time.Time, appointDay, frequency string)
 	}
 
 	return
-}
+}
+
+// CalculatePercentile 计算数值分位
+func CalculatePercentile(x float64, min float64, max float64) float64 {
+	return (x/100)*(max-min) + min
+}

+ 3 - 0
services/data/chart_theme.go

@@ -80,6 +80,9 @@ func GetThemePreviewChartEdbData(chartType int, calendar, startDate, endDate str
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
 			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)