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
 | |
| }
 |