Browse Source

自定义右轴

zwxi 8 months ago
parent
commit
e1acd5373d
3 changed files with 179 additions and 31 deletions
  1. 51 27
      models/data_manage/chart_info.go
  2. 22 4
      services/data/chart_info.go
  3. 106 0
      services/data/edb_data.go

+ 51 - 27
models/data_manage/chart_info.go

@@ -263,33 +263,50 @@ type EditChartInfoReq struct {
 	UnitEn               string                  `description:"英文单位名称"`
 }
 
-//type MarkersLine struct {
-//	Axis             int             `json:"axis" description:"1左轴 2右轴 3横轴"`
-//	AxisName         string          `json:"axisName" description:"轴的名称,例如'左轴'"`
-//	MarkLineType     int             `json:"markLineType" description:"1:固定 2:指标计算"`
-//	Value            string          `json:"value" description:"连线指向的数值,例如'4000'"`
-//	From             string          `json:"from" description:"连线的起始点,可以为空"`
-//	To               string          `json:"to" description:"连线的结束点,可以为空"`
-//	LineWidth        int             `json:"lineWidth" description:"连线的宽度"`
-//	DashStyle        string          `json:"dashStyle" description:"连线的虚线样式,例如'ShortDashDot'"`
-//	Color            string          `json:"color" description:"连线的颜色"`
-//	Text             string          `json:"text" description:"连线旁边显示的文本"`
-//	TextPosition     string          `json:"textPosition" description:"文本的显示位置,例如'bottom'"`
-//	TextColor        string          `json:"textColor" description:"文本颜色"`
-//	TextFontSize     int             `json:"textFontSize" description:"文本的字号大小"`
-//	IsShow           bool            `json:"isShow" description:"是否显示连线及文本"`
-//	Calculation      int             `json:"calculation" description:"计算方式 1区间均值 2区间均值加N倍标准差 3区间个数分位 4区间数值分位"`
-//	CalculationValue int             `json:"calculationValue" description:"计算方式对应的值 2就是几倍标准差 3就是分位值 4就是数值值·"`
-//	TimeIntervalType int             `json:"timeInterval" description:"时间区间 0跟随图表 1自定义"`
-//	StartDate        MarkersLineTime `json:"startTime" description:"开始时间"`
-//	EndDate          MarkersLineTime `json:"endTime" description:"结束时间"`
-//}
-//
-//type MarkersLineTime struct {
-//	TimeType int                       `json:"timeType" description:"时间类型 1固定 2动态"`
-//	Date     string                    `json:"date" description:"日期"`
-//	Conf     request.EdbDateChangeConf `json:"conf" description:"动态时间配置"`
-//}
+type MarkersLine struct {
+	Axis             int             `json:"axis" description:"1左轴 2右轴 3横轴"`
+	AxisName         string          `json:"axisName" description:"轴的名称,例如'左轴'"`
+	MarkerType       string          `json:"markerType" description:"标识线或标识区"`
+	MarkLineType     int             `json:"markLineType" description:"1:固定 2:指标计算"`
+	Value            string          `json:"value" description:"连线指向的数值,例如'4000'"`
+	FromValue        string          `json:"fromValue" description:"连线的起始点,可以为空"`
+	ToValue          string          `json:"toValue" description:"连线的结束点,可以为空"`
+	LineWidth        int             `json:"lineWidth" description:"连线的宽度"`
+	DashStyle        string          `json:"dashStyle" description:"连线的虚线样式,例如'ShortDashDot'"`
+	Color            string          `json:"color" description:"连线的颜色"`
+	Text             string          `json:"text" description:"连线旁边显示的文本"`
+	TextPosition     string          `json:"textPosition" description:"文本的显示位置,例如'bottom'"`
+	TextColor        string          `json:"textColor" description:"文本颜色"`
+	TextFontSize     int             `json:"textFontSize" description:"文本的字号大小"`
+	IsShow           bool            `json:"isShow" description:"是否显示连线及文本"`
+	Calculation      int             `json:"calculation" description:"计算方式 1区间均值 2区间均值加N倍标准差 3区间个数分位 4区间数值分位"`
+	CalculationValue int             `json:"calculationValue" description:"计算方式对应的值 2就是几倍标准差 3就是分位值 4就是数值值·"`
+	TimeIntervalType int             `json:"timeInterval" description:"时间区间 0跟随图表 1自定义"`
+	StartDate        MarkersLineTime `json:"startTime" description:"开始时间"`
+	EndDate          MarkersLineTime `json:"endTime" description:"结束时间"`
+}
+
+type MarkersLineTime struct {
+	TimeType int               `json:"timeType" description:"时间类型 1固定 2动态"`
+	Date     string            `json:"date" description:"日期"`
+	Conf     EdbDateChangeConf `json:"conf" description:"动态时间配置"`
+}
+
+// EdbDateExtraConf
+// @Description: 导入指标日期前移和日期变换
+type EdbDateChangeConf struct {
+	MoveForward int `description:"前移的期数"`
+	DateChange  []*EdbDateConfDateChange
+}
+
+type EdbDateConfDateChange struct {
+	Year         int
+	Month        int
+	Day          int
+	Frequency    string `description:"频度变换"`
+	FrequencyDay string `description:"频度的固定日期"`
+	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
+}
 
 type EditChartEnInfoReq struct {
 	ChartInfoId      int                       `description:"图表ID"`
@@ -1536,6 +1553,13 @@ type SeasonChartResp struct {
 	MaxMinLimits                MaxMinLimitsResp                `description:"自定义上下限"`
 	SamePeriodAverage           SamePeriodAverageResp           `description:"自定义同期均线"`
 	SamePeriodStandardDeviation SamePeriodStandardDeviationResp `description:"自定义同期标准差线"`
+	RightAxis                   SeasonRightAxisResp             `description:"自定义右轴指标"`
+}
+
+// 自定义右轴指标
+type SeasonRightAxisResp struct {
+	SeasonRightAxis
+	EdbInfoList   []*ChartEdbInfoMapping
 }
 
 type MaxMinLimitsResp struct {

+ 22 - 4
services/data/chart_info.go

@@ -3340,7 +3340,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			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-- {
+			for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year && i > 0; i-- {
 				// 插值成日度
 				dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
 				if err != nil {
@@ -3356,7 +3356,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
-						valueMap[newDate] = (handleDataMap[date] + value)/2
+						valueMap[newDate] = (handleDataMap[date] + value) / 2
 					} else {
 						valueMap[newDate] = handleDataMap[date]
 					}
@@ -3401,7 +3401,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			valueMap := make(map[time.Time]float64)
 
 			samePeriodStandardDeviationList := make([]*data_manage.MaxMinLimitsData, 0)
-			for i := len(quarterDataList) - 1 ; i > len(quarterDataList) - seasonConfig.SamePeriodAverage.Year-1 && i > 0; i-- {
+			for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year-1 && i > 0; i-- {
 				// 插值成日度
 				dataTimeList, _, err = HandleDataByLinearRegressionToListV2(quarterDataList[i].DataList, handleDataMap)
 				if err != nil {
@@ -3417,7 +3417,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
-						valueMap[newDate] = (handleDataMap[date] + value)/2
+						valueMap[newDate] = (handleDataMap[date] + value) / 2
 					} else {
 						valueMap[newDate] = handleDataMap[date]
 					}
@@ -3461,6 +3461,24 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			dataResp.SamePeriodStandardDeviation.Year = seasonConfig.SamePeriodStandardDeviation.Year
 		}
 
+		// 自定义右轴
+		if seasonConfig.RightAxis.IndicatorType == 1 {
+			//dataResp.RightAxis.EdbInfoList = quarterDataList[0].DataList
+			startTime, _ := time.Parse(utils.FormatDate, mappingItem.StartDate)
+			for i := len(quarterDataList) - 1; i > len(quarterDataList)-2 && i > 0; i-- {
+				rightMappingItem := mappingItem
+				// 计算同比值
+				dataList, _, _, e := GetEdbDataTbzForSeason(mappingItem.Frequency, quarterDataList[i].DataList, startTime)
+				if e != nil {
+					err = errors.New("计算同比值失败, Err:" + e.Error())
+					return
+				}
+				rightMappingItem.DataList = dataList
+				dataResp.RightAxis.EdbInfoList = append(dataResp.RightAxis.EdbInfoList, rightMappingItem)
+				dataResp.RightAxis.SeasonRightAxis = seasonConfig.RightAxis
+			}
+
+		}
 	}
 
 	return

+ 106 - 0
services/data/edb_data.go

@@ -515,3 +515,109 @@ func getPageDataByMongo(edbInfoId, source, subSource int, endDataTime string, st
 
 	return
 }
+
+// GetEdbDataTbzForSeason 获取指标的同比值数据
+func GetEdbDataTbzForSeason(frequency string, tmpDataList []*data_manage.EdbDataList, startDateTime time.Time) (dataList []*data_manage.EdbDataList, minValue, maxValue float64, err error) {
+	dataList = make([]*data_manage.EdbDataList, 0)
+
+	// 数据处理
+	var dateArr []string
+	dataMap := make(map[string]*data_manage.EdbDataList)
+	for _, v := range tmpDataList {
+		dateArr = append(dateArr, v.DataTime)
+		dataMap[v.DataTime] = v
+	}
+	for _, av := range dateArr {
+		currentItem, ok := dataMap[av]
+		// 如果找不到当前日期的数据,那么终止当前循环,进入下一循环
+		if !ok {
+			continue
+		}
+		tmpItem := *currentItem
+		var isOk bool //是否计算出来结果
+
+		//当前日期
+		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 如果存在开始日期,同时,当前日期早于开始日期,那么终止当前循环,进入下一循环
+		if !startDateTime.IsZero() && currentDate.Before(startDateTime) {
+			continue
+		}
+		//上一年的日期
+		preDate := currentDate.AddDate(-1, 0, 0)
+		preDateStr := preDate.Format(utils.FormatDate)
+		if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
+			tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+			isOk = true
+		} else {
+			if frequency == "月度" { //向上和向下,各找一个月
+				for i := 0; i <= 35; i++ {
+					nextDateDay := preDate.AddDate(0, 0, i)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+					if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+						tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+						isOk = true
+						break
+					} else {
+						preDateDay := preDate.AddDate(0, 0, -i)
+						preDateDayStr := preDateDay.Format(utils.FormatDate)
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+							isOk = true
+							break
+						}
+					}
+				}
+			} else if frequency == "季度" || frequency == "年度" {
+				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
+					tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+					isOk = true
+					break
+				}
+			} else {
+				nextDateDay := preDate.AddDate(0, 0, 1)
+				nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+				preDateDay := preDate.AddDate(0, 0, -1)
+				preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+				for i := 0; i < 35; i++ {
+					if i >= 1 {
+						nextDateDay = nextDateDay.AddDate(0, 0, i)
+						nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+					}
+					if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+						tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+						isOk = true
+						break
+					} else {
+						if i >= 1 {
+							preDateDay = preDate.AddDate(0, 0, -i)
+							preDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+							isOk = true
+							break
+						}
+					}
+				}
+			}
+		}
+
+		if isOk {
+			if tmpItem.Value > maxValue {
+				maxValue = tmpItem.Value
+			}
+			if tmpItem.Value < minValue {
+				minValue = tmpItem.Value
+			}
+			dataList = append(dataList, &tmpItem)
+		}
+	}
+
+	return
+}