413 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			413 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package statistics | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"fmt" | ||
|  | 	"time" | ||
|  | ) | ||
|  | 
 | ||
|  | // ================ 命令对象 ================ | ||
|  | 
 | ||
|  | // CreateMetricCommand 创建指标命令 | ||
|  | type CreateMetricCommand struct { | ||
|  | 	MetricType string    `json:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" validate:"required" comment:"指标名称"` | ||
|  | 	Dimension  string    `json:"dimension" comment:"统计维度"` | ||
|  | 	Value      float64   `json:"value" validate:"min=0" comment:"指标值"` | ||
|  | 	Metadata   string    `json:"metadata" comment:"额外维度信息"` | ||
|  | 	Date       time.Time `json:"date" validate:"required" comment:"统计日期"` | ||
|  | } | ||
|  | 
 | ||
|  | // UpdateMetricCommand 更新指标命令 | ||
|  | type UpdateMetricCommand struct { | ||
|  | 	ID    string  `json:"id" validate:"required" comment:"指标ID"` | ||
|  | 	Value float64 `json:"value" validate:"min=0" comment:"新指标值"` | ||
|  | } | ||
|  | 
 | ||
|  | // DeleteMetricCommand 删除指标命令 | ||
|  | type DeleteMetricCommand struct { | ||
|  | 	ID string `json:"id" validate:"required" comment:"指标ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // GenerateReportCommand 生成报告命令 | ||
|  | type GenerateReportCommand struct { | ||
|  | 	ReportType string                 `json:"report_type" validate:"required" comment:"报告类型"` | ||
|  | 	Title      string                 `json:"title" validate:"required" comment:"报告标题"` | ||
|  | 	Period     string                 `json:"period" validate:"required" comment:"统计周期"` | ||
|  | 	UserRole   string                 `json:"user_role" validate:"required" comment:"用户角色"` | ||
|  | 	StartDate  time.Time             `json:"start_date" comment:"开始日期"` | ||
|  | 	EndDate    time.Time             `json:"end_date" comment:"结束日期"` | ||
|  | 	Filters    map[string]interface{} `json:"filters" comment:"过滤条件"` | ||
|  | 	GeneratedBy string               `json:"generated_by" validate:"required" comment:"生成者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // CreateDashboardCommand 创建仪表板命令 | ||
|  | type CreateDashboardCommand struct { | ||
|  | 	Name            string `json:"name" validate:"required" comment:"仪表板名称"` | ||
|  | 	Description     string `json:"description" comment:"仪表板描述"` | ||
|  | 	UserRole        string `json:"user_role" validate:"required" comment:"用户角色"` | ||
|  | 	Layout          string `json:"layout" comment:"布局配置"` | ||
|  | 	Widgets         string `json:"widgets" comment:"组件配置"` | ||
|  | 	Settings        string `json:"settings" comment:"设置配置"` | ||
|  | 	RefreshInterval int    `json:"refresh_interval" validate:"min=30" comment:"刷新间隔(秒)"` | ||
|  | 	AccessLevel     string `json:"access_level" comment:"访问级别"` | ||
|  | 	CreatedBy       string `json:"created_by" validate:"required" comment:"创建者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // UpdateDashboardCommand 更新仪表板命令 | ||
|  | type UpdateDashboardCommand struct { | ||
|  | 	ID              string `json:"id" validate:"required" comment:"仪表板ID"` | ||
|  | 	Name            string `json:"name" comment:"仪表板名称"` | ||
|  | 	Description     string `json:"description" comment:"仪表板描述"` | ||
|  | 	Layout          string `json:"layout" comment:"布局配置"` | ||
|  | 	Widgets         string `json:"widgets" comment:"组件配置"` | ||
|  | 	Settings        string `json:"settings" comment:"设置配置"` | ||
|  | 	RefreshInterval int    `json:"refresh_interval" validate:"min=30" comment:"刷新间隔(秒)"` | ||
|  | 	AccessLevel     string `json:"access_level" comment:"访问级别"` | ||
|  | 	UpdatedBy       string `json:"updated_by" validate:"required" comment:"更新者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // SetDefaultDashboardCommand 设置默认仪表板命令 | ||
|  | type SetDefaultDashboardCommand struct { | ||
|  | 	DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"` | ||
|  | 	UserRole    string `json:"user_role" validate:"required" comment:"用户角色"` | ||
|  | 	UpdatedBy   string `json:"updated_by" validate:"required" comment:"更新者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // ActivateDashboardCommand 激活仪表板命令 | ||
|  | type ActivateDashboardCommand struct { | ||
|  | 	DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"` | ||
|  | 	ActivatedBy string `json:"activated_by" validate:"required" comment:"激活者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // DeactivateDashboardCommand 停用仪表板命令 | ||
|  | type DeactivateDashboardCommand struct { | ||
|  | 	DashboardID   string `json:"dashboard_id" validate:"required" comment:"仪表板ID"` | ||
|  | 	DeactivatedBy string `json:"deactivated_by" validate:"required" comment:"停用者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // DeleteDashboardCommand 删除仪表板命令 | ||
|  | type DeleteDashboardCommand struct { | ||
|  | 	DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"` | ||
|  | 	DeletedBy   string `json:"deleted_by" validate:"required" comment:"删除者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // ExportDataCommand 导出数据命令 | ||
|  | type ExportDataCommand struct { | ||
|  | 	Format      string                 `json:"format" validate:"required" comment:"导出格式"` | ||
|  | 	MetricType string                 `json:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	StartDate  time.Time             `json:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate    time.Time             `json:"end_date" validate:"required" comment:"结束日期"` | ||
|  | 	Dimension  string                 `json:"dimension" comment:"统计维度"` | ||
|  | 	GroupBy    string                 `json:"group_by" comment:"分组维度"` | ||
|  | 	Filters    map[string]interface{} `json:"filters" comment:"过滤条件"` | ||
|  | 	Columns    []string               `json:"columns" comment:"导出列"` | ||
|  | 	IncludeCharts bool               `json:"include_charts" comment:"是否包含图表"` | ||
|  | 	ExportedBy string                 `json:"exported_by" validate:"required" comment:"导出者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // TriggerAggregationCommand 触发数据聚合命令 | ||
|  | type TriggerAggregationCommand struct { | ||
|  | 	MetricType string    `json:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	Period     string    `json:"period" validate:"required" comment:"聚合周期"` | ||
|  | 	StartDate  time.Time `json:"start_date" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" comment:"结束日期"` | ||
|  | 	Force      bool      `json:"force" comment:"是否强制重新聚合"` | ||
|  | 	TriggeredBy string   `json:"triggered_by" validate:"required" comment:"触发者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证触发聚合命令 | ||
|  | func (c *TriggerAggregationCommand) Validate() error { | ||
|  | 	if c.MetricType == "" { | ||
|  | 		return fmt.Errorf("指标类型不能为空") | ||
|  | 	} | ||
|  | 	if c.Period == "" { | ||
|  | 		return fmt.Errorf("聚合周期不能为空") | ||
|  | 	} | ||
|  | 	if c.TriggeredBy == "" { | ||
|  | 		return fmt.Errorf("触发者ID不能为空") | ||
|  | 	} | ||
|  | 	// 验证周期类型 | ||
|  | 	validPeriods := []string{"hourly", "daily", "weekly", "monthly"} | ||
|  | 	isValidPeriod := false | ||
|  | 	for _, period := range validPeriods { | ||
|  | 		if c.Period == period { | ||
|  | 			isValidPeriod = true | ||
|  | 			break | ||
|  | 		} | ||
|  | 	} | ||
|  | 	if !isValidPeriod { | ||
|  | 		return fmt.Errorf("不支持的聚合周期: %s", c.Period) | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 查询对象 ================ | ||
|  | 
 | ||
|  | // GetMetricsQuery 获取指标查询 | ||
|  | type GetMetricsQuery struct { | ||
|  | 	MetricType string    `json:"metric_type" form:"metric_type" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" form:"metric_name" comment:"指标名称"` | ||
|  | 	Dimension  string    `json:"dimension" form:"dimension" comment:"统计维度"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" comment:"结束日期"` | ||
|  | 	Limit      int       `json:"limit" form:"limit" comment:"限制数量"` | ||
|  | 	Offset     int       `json:"offset" form:"offset" comment:"偏移量"` | ||
|  | 	SortBy     string    `json:"sort_by" form:"sort_by" comment:"排序字段"` | ||
|  | 	SortOrder  string    `json:"sort_order" form:"sort_order" comment:"排序顺序"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetRealtimeMetricsQuery 获取实时指标查询 | ||
|  | type GetRealtimeMetricsQuery struct { | ||
|  | 	MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	TimeRange  string `json:"time_range" form:"time_range" comment:"时间范围"` | ||
|  | 	Dimension  string `json:"dimension" form:"dimension" comment:"统计维度"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetHistoricalMetricsQuery 获取历史指标查询 | ||
|  | type GetHistoricalMetricsQuery struct { | ||
|  | 	MetricType string    `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" form:"metric_name" comment:"指标名称"` | ||
|  | 	Dimension  string    `json:"dimension" form:"dimension" comment:"统计维度"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"` | ||
|  | 	Period     string    `json:"period" form:"period" comment:"统计周期"` | ||
|  | 	Limit      int       `json:"limit" form:"limit" comment:"限制数量"` | ||
|  | 	Offset     int       `json:"offset" form:"offset" comment:"偏移量"` | ||
|  | 	AggregateBy string   `json:"aggregate_by" form:"aggregate_by" comment:"聚合维度"` | ||
|  | 	GroupBy    string    `json:"group_by" form:"group_by" comment:"分组维度"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetDashboardDataQuery 获取仪表板数据查询 | ||
|  | type GetDashboardDataQuery struct { | ||
|  | 	UserRole   string    `json:"user_role" form:"user_role" validate:"required" comment:"用户角色"` | ||
|  | 	Period     string    `json:"period" form:"period" comment:"统计周期"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" comment:"结束日期"` | ||
|  | 	MetricTypes []string `json:"metric_types" form:"metric_types" comment:"指标类型列表"` | ||
|  | 	Dimensions  []string `json:"dimensions" form:"dimensions" comment:"统计维度列表"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetReportsQuery 获取报告查询 | ||
|  | type GetReportsQuery struct { | ||
|  | 	ReportType string    `json:"report_type" form:"report_type" comment:"报告类型"` | ||
|  | 	UserRole   string    `json:"user_role" form:"user_role" comment:"用户角色"` | ||
|  | 	Status     string    `json:"status" form:"status" comment:"报告状态"` | ||
|  | 	Period     string    `json:"period" form:"period" comment:"统计周期"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" comment:"结束日期"` | ||
|  | 	Limit      int       `json:"limit" form:"limit" comment:"限制数量"` | ||
|  | 	Offset     int       `json:"offset" form:"offset" comment:"偏移量"` | ||
|  | 	SortBy     string    `json:"sort_by" form:"sort_by" comment:"排序字段"` | ||
|  | 	SortOrder  string    `json:"sort_order" form:"sort_order" comment:"排序顺序"` | ||
|  | 	GeneratedBy string   `json:"generated_by" form:"generated_by" comment:"生成者ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetDashboardsQuery 获取仪表板查询 | ||
|  | type GetDashboardsQuery struct { | ||
|  | 	UserRole    string `json:"user_role" form:"user_role" comment:"用户角色"` | ||
|  | 	IsDefault   *bool  `json:"is_default" form:"is_default" comment:"是否默认"` | ||
|  | 	IsActive    *bool  `json:"is_active" form:"is_active" comment:"是否激活"` | ||
|  | 	AccessLevel string `json:"access_level" form:"access_level" comment:"访问级别"` | ||
|  | 	CreatedBy   string `json:"created_by" form:"created_by" comment:"创建者ID"` | ||
|  | 	Name        string `json:"name" form:"name" comment:"仪表板名称"` | ||
|  | 	Limit       int    `json:"limit" form:"limit" comment:"限制数量"` | ||
|  | 	Offset      int    `json:"offset" form:"offset" comment:"偏移量"` | ||
|  | 	SortBy      string `json:"sort_by" form:"sort_by" comment:"排序字段"` | ||
|  | 	SortOrder   string `json:"sort_order" form:"sort_order" comment:"排序顺序"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetReportQuery 获取单个报告查询 | ||
|  | type GetReportQuery struct { | ||
|  | 	ReportID string `json:"report_id" form:"report_id" validate:"required" comment:"报告ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetDashboardQuery 获取单个仪表板查询 | ||
|  | type GetDashboardQuery struct { | ||
|  | 	DashboardID string `json:"dashboard_id" form:"dashboard_id" validate:"required" comment:"仪表板ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // GetMetricQuery 获取单个指标查询 | ||
|  | type GetMetricQuery struct { | ||
|  | 	MetricID string `json:"metric_id" form:"metric_id" validate:"required" comment:"指标ID"` | ||
|  | } | ||
|  | 
 | ||
|  | // CalculateGrowthRateQuery 计算增长率查询 | ||
|  | type CalculateGrowthRateQuery struct { | ||
|  | 	MetricType      string    `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName      string    `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"` | ||
|  | 	CurrentPeriod   time.Time `json:"current_period" form:"current_period" validate:"required" comment:"当前周期"` | ||
|  | 	PreviousPeriod  time.Time `json:"previous_period" form:"previous_period" validate:"required" comment:"上一周期"` | ||
|  | } | ||
|  | 
 | ||
|  | // CalculateTrendQuery 计算趋势查询 | ||
|  | type CalculateTrendQuery struct { | ||
|  | 	MetricType string    `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"` | ||
|  | } | ||
|  | 
 | ||
|  | // CalculateCorrelationQuery 计算相关性查询 | ||
|  | type CalculateCorrelationQuery struct { | ||
|  | 	MetricType1 string    `json:"metric_type1" form:"metric_type1" validate:"required" comment:"指标类型1"` | ||
|  | 	MetricName1 string    `json:"metric_name1" form:"metric_name1" validate:"required" comment:"指标名称1"` | ||
|  | 	MetricType2 string    `json:"metric_type2" form:"metric_type2" validate:"required" comment:"指标类型2"` | ||
|  | 	MetricName2 string    `json:"metric_name2" form:"metric_name2" validate:"required" comment:"指标名称2"` | ||
|  | 	StartDate   time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate     time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"` | ||
|  | } | ||
|  | 
 | ||
|  | // CalculateMovingAverageQuery 计算移动平均查询 | ||
|  | type CalculateMovingAverageQuery struct { | ||
|  | 	MetricType string    `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"` | ||
|  | 	WindowSize int       `json:"window_size" form:"window_size" validate:"min=1" comment:"窗口大小"` | ||
|  | } | ||
|  | 
 | ||
|  | // CalculateSeasonalityQuery 计算季节性查询 | ||
|  | type CalculateSeasonalityQuery struct { | ||
|  | 	MetricType string    `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"` | ||
|  | 	MetricName string    `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"` | ||
|  | 	StartDate  time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"` | ||
|  | 	EndDate    time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"` | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 响应对象 ================ | ||
|  | 
 | ||
|  | // CommandResponse 命令响应 | ||
|  | type CommandResponse struct { | ||
|  | 	Success bool                   `json:"success" comment:"是否成功"` | ||
|  | 	Message string                 `json:"message" comment:"响应消息"` | ||
|  | 	Data    interface{}            `json:"data" comment:"响应数据"` | ||
|  | 	Error   string                 `json:"error,omitempty" comment:"错误信息"` | ||
|  | } | ||
|  | 
 | ||
|  | // QueryResponse 查询响应 | ||
|  | type QueryResponse struct { | ||
|  | 	Success bool                   `json:"success" comment:"是否成功"` | ||
|  | 	Message string                 `json:"message" comment:"响应消息"` | ||
|  | 	Data    interface{}            `json:"data" comment:"响应数据"` | ||
|  | 	Meta    map[string]interface{} `json:"meta" comment:"元数据"` | ||
|  | 	Error   string                 `json:"error,omitempty" comment:"错误信息"` | ||
|  | } | ||
|  | 
 | ||
|  | // ListResponse 列表响应 | ||
|  | type ListResponse struct { | ||
|  | 	Success    bool                   `json:"success" comment:"是否成功"` | ||
|  | 	Message    string                 `json:"message" comment:"响应消息"` | ||
|  | 	Data       ListDataDTO            `json:"data" comment:"数据列表"` | ||
|  | 	Meta       map[string]interface{} `json:"meta" comment:"元数据"` | ||
|  | 	Error      string                 `json:"error,omitempty" comment:"错误信息"` | ||
|  | } | ||
|  | 
 | ||
|  | // ListDataDTO 列表数据DTO | ||
|  | type ListDataDTO struct { | ||
|  | 	Total int64         `json:"total" comment:"总数"` | ||
|  | 	Page  int           `json:"page" comment:"页码"` | ||
|  | 	Size  int           `json:"size" comment:"每页数量"` | ||
|  | 	Items []interface{} `json:"items" comment:"数据列表"` | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 验证方法 ================ | ||
|  | 
 | ||
|  | // Validate 验证创建指标命令 | ||
|  | func (c *CreateMetricCommand) Validate() error { | ||
|  | 	if c.MetricType == "" { | ||
|  | 		return fmt.Errorf("指标类型不能为空") | ||
|  | 	} | ||
|  | 	if c.MetricName == "" { | ||
|  | 		return fmt.Errorf("指标名称不能为空") | ||
|  | 	} | ||
|  | 	if c.Value < 0 { | ||
|  | 		return fmt.Errorf("指标值不能为负数") | ||
|  | 	} | ||
|  | 	if c.Date.IsZero() { | ||
|  | 		return fmt.Errorf("统计日期不能为空") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证更新指标命令 | ||
|  | func (c *UpdateMetricCommand) Validate() error { | ||
|  | 	if c.ID == "" { | ||
|  | 		return fmt.Errorf("指标ID不能为空") | ||
|  | 	} | ||
|  | 	if c.Value < 0 { | ||
|  | 		return fmt.Errorf("指标值不能为负数") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证生成报告命令 | ||
|  | func (c *GenerateReportCommand) Validate() error { | ||
|  | 	if c.ReportType == "" { | ||
|  | 		return fmt.Errorf("报告类型不能为空") | ||
|  | 	} | ||
|  | 	if c.Title == "" { | ||
|  | 		return fmt.Errorf("报告标题不能为空") | ||
|  | 	} | ||
|  | 	if c.Period == "" { | ||
|  | 		return fmt.Errorf("统计周期不能为空") | ||
|  | 	} | ||
|  | 	if c.UserRole == "" { | ||
|  | 		return fmt.Errorf("用户角色不能为空") | ||
|  | 	} | ||
|  | 	if c.GeneratedBy == "" { | ||
|  | 		return fmt.Errorf("生成者ID不能为空") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证创建仪表板命令 | ||
|  | func (c *CreateDashboardCommand) Validate() error { | ||
|  | 	if c.Name == "" { | ||
|  | 		return fmt.Errorf("仪表板名称不能为空") | ||
|  | 	} | ||
|  | 	if c.UserRole == "" { | ||
|  | 		return fmt.Errorf("用户角色不能为空") | ||
|  | 	} | ||
|  | 	if c.CreatedBy == "" { | ||
|  | 		return fmt.Errorf("创建者ID不能为空") | ||
|  | 	} | ||
|  | 	if c.RefreshInterval < 30 { | ||
|  | 		return fmt.Errorf("刷新间隔不能少于30秒") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证更新仪表板命令 | ||
|  | func (c *UpdateDashboardCommand) Validate() error { | ||
|  | 	if c.ID == "" { | ||
|  | 		return fmt.Errorf("仪表板ID不能为空") | ||
|  | 	} | ||
|  | 	if c.UpdatedBy == "" { | ||
|  | 		return fmt.Errorf("更新者ID不能为空") | ||
|  | 	} | ||
|  | 	if c.RefreshInterval < 30 { | ||
|  | 		return fmt.Errorf("刷新间隔不能少于30秒") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // Validate 验证导出数据命令 | ||
|  | func (c *ExportDataCommand) Validate() error { | ||
|  | 	if c.Format == "" { | ||
|  | 		return fmt.Errorf("导出格式不能为空") | ||
|  | 	} | ||
|  | 	if c.MetricType == "" { | ||
|  | 		return fmt.Errorf("指标类型不能为空") | ||
|  | 	} | ||
|  | 	if c.StartDate.IsZero() || c.EndDate.IsZero() { | ||
|  | 		return fmt.Errorf("开始日期和结束日期不能为空") | ||
|  | 	} | ||
|  | 	if c.StartDate.After(c.EndDate) { | ||
|  | 		return fmt.Errorf("开始日期不能晚于结束日期") | ||
|  | 	} | ||
|  | 	if c.ExportedBy == "" { | ||
|  | 		return fmt.Errorf("导出者ID不能为空") | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } |