573 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			573 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package events | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"encoding/json" | ||
|  | 	"time" | ||
|  | 
 | ||
|  | 	"github.com/google/uuid" | ||
|  | ) | ||
|  | 
 | ||
|  | // StatisticsEventType 统计事件类型 | ||
|  | type StatisticsEventType string | ||
|  | 
 | ||
|  | const ( | ||
|  | 	// 指标相关事件 | ||
|  | 	MetricCreatedEventType     StatisticsEventType = "statistics.metric.created" | ||
|  | 	MetricUpdatedEventType     StatisticsEventType = "statistics.metric.updated" | ||
|  | 	MetricAggregatedEventType  StatisticsEventType = "statistics.metric.aggregated" | ||
|  | 	 | ||
|  | 	// 报告相关事件 | ||
|  | 	ReportCreatedEventType      StatisticsEventType = "statistics.report.created" | ||
|  | 	ReportGenerationStartedEventType StatisticsEventType = "statistics.report.generation_started" | ||
|  | 	ReportCompletedEventType    StatisticsEventType = "statistics.report.completed" | ||
|  | 	ReportFailedEventType       StatisticsEventType = "statistics.report.failed" | ||
|  | 	ReportExpiredEventType      StatisticsEventType = "statistics.report.expired" | ||
|  | 	 | ||
|  | 	// 仪表板相关事件 | ||
|  | 	DashboardCreatedEventType   StatisticsEventType = "statistics.dashboard.created" | ||
|  | 	DashboardUpdatedEventType   StatisticsEventType = "statistics.dashboard.updated" | ||
|  | 	DashboardActivatedEventType StatisticsEventType = "statistics.dashboard.activated" | ||
|  | 	DashboardDeactivatedEventType StatisticsEventType = "statistics.dashboard.deactivated" | ||
|  | ) | ||
|  | 
 | ||
|  | // BaseStatisticsEvent 统计事件基础结构 | ||
|  | type BaseStatisticsEvent struct { | ||
|  | 	ID            string                 `json:"id"` | ||
|  | 	Type          string                 `json:"type"` | ||
|  | 	Version       string                 `json:"version"` | ||
|  | 	Timestamp     time.Time              `json:"timestamp"` | ||
|  | 	Source        string                 `json:"source"` | ||
|  | 	AggregateID   string                 `json:"aggregate_id"` | ||
|  | 	AggregateType string                 `json:"aggregate_type"` | ||
|  | 	Metadata      map[string]interface{} `json:"metadata"` | ||
|  | 	Payload       interface{}            `json:"payload"` | ||
|  | 
 | ||
|  | 	// DDD特有字段 | ||
|  | 	DomainVersion string `json:"domain_version"` | ||
|  | 	CausationID   string `json:"causation_id"` | ||
|  | 	CorrelationID string `json:"correlation_id"` | ||
|  | } | ||
|  | 
 | ||
|  | // 实现 Event 接口 | ||
|  | func (e *BaseStatisticsEvent) GetID() string { | ||
|  | 	return e.ID | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetType() string { | ||
|  | 	return e.Type | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetVersion() string { | ||
|  | 	return e.Version | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetTimestamp() time.Time { | ||
|  | 	return e.Timestamp | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetPayload() interface{} { | ||
|  | 	return e.Payload | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetMetadata() map[string]interface{} { | ||
|  | 	return e.Metadata | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetSource() string { | ||
|  | 	return e.Source | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetAggregateID() string { | ||
|  | 	return e.AggregateID | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetAggregateType() string { | ||
|  | 	return e.AggregateType | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetDomainVersion() string { | ||
|  | 	return e.DomainVersion | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetCausationID() string { | ||
|  | 	return e.CausationID | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) GetCorrelationID() string { | ||
|  | 	return e.CorrelationID | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) Marshal() ([]byte, error) { | ||
|  | 	return json.Marshal(e) | ||
|  | } | ||
|  | 
 | ||
|  | func (e *BaseStatisticsEvent) Unmarshal(data []byte) error { | ||
|  | 	return json.Unmarshal(data, e) | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 指标相关事件 ================ | ||
|  | 
 | ||
|  | // MetricCreatedEvent 指标创建事件 | ||
|  | type MetricCreatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	MetricID   string    `json:"metric_id"` | ||
|  | 	MetricType string    `json:"metric_type"` | ||
|  | 	MetricName string    `json:"metric_name"` | ||
|  | 	Value      float64   `json:"value"` | ||
|  | 	Dimension  string    `json:"dimension"` | ||
|  | 	Date       time.Time `json:"date"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewMetricCreatedEvent(metricID, metricType, metricName, dimension string, value float64, date time.Time, correlationID string) *MetricCreatedEvent { | ||
|  | 	return &MetricCreatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(MetricCreatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   metricID, | ||
|  | 			AggregateType: "StatisticsMetric", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"metric_id":   metricID, | ||
|  | 				"metric_type": metricType, | ||
|  | 				"metric_name": metricName, | ||
|  | 				"dimension":   dimension, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		MetricID:   metricID, | ||
|  | 		MetricType: metricType, | ||
|  | 		MetricName: metricName, | ||
|  | 		Value:      value, | ||
|  | 		Dimension:  dimension, | ||
|  | 		Date:       date, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *MetricCreatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"metric_id":   e.MetricID, | ||
|  | 		"metric_type": e.MetricType, | ||
|  | 		"metric_name": e.MetricName, | ||
|  | 		"value":       e.Value, | ||
|  | 		"dimension":   e.Dimension, | ||
|  | 		"date":        e.Date, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // MetricUpdatedEvent 指标更新事件 | ||
|  | type MetricUpdatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	MetricID  string    `json:"metric_id"` | ||
|  | 	OldValue  float64   `json:"old_value"` | ||
|  | 	NewValue  float64   `json:"new_value"` | ||
|  | 	UpdatedAt time.Time `json:"updated_at"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewMetricUpdatedEvent(metricID string, oldValue, newValue float64, correlationID string) *MetricUpdatedEvent { | ||
|  | 	return &MetricUpdatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(MetricUpdatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   metricID, | ||
|  | 			AggregateType: "StatisticsMetric", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"metric_id": metricID, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		MetricID:  metricID, | ||
|  | 		OldValue:  oldValue, | ||
|  | 		NewValue:  newValue, | ||
|  | 		UpdatedAt: time.Now(), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *MetricUpdatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"metric_id":  e.MetricID, | ||
|  | 		"old_value":  e.OldValue, | ||
|  | 		"new_value":  e.NewValue, | ||
|  | 		"updated_at": e.UpdatedAt, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // MetricAggregatedEvent 指标聚合事件 | ||
|  | type MetricAggregatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	MetricType    string    `json:"metric_type"` | ||
|  | 	Dimension     string    `json:"dimension"` | ||
|  | 	AggregatedAt  time.Time `json:"aggregated_at"` | ||
|  | 	RecordCount   int       `json:"record_count"` | ||
|  | 	TotalValue    float64   `json:"total_value"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewMetricAggregatedEvent(metricType, dimension string, recordCount int, totalValue float64, correlationID string) *MetricAggregatedEvent { | ||
|  | 	return &MetricAggregatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(MetricAggregatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   uuid.New().String(), | ||
|  | 			AggregateType: "StatisticsMetric", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"metric_type": metricType, | ||
|  | 				"dimension":   dimension, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		MetricType:   metricType, | ||
|  | 		Dimension:    dimension, | ||
|  | 		AggregatedAt: time.Now(), | ||
|  | 		RecordCount:  recordCount, | ||
|  | 		TotalValue:   totalValue, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *MetricAggregatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"metric_type":    e.MetricType, | ||
|  | 		"dimension":      e.Dimension, | ||
|  | 		"aggregated_at":  e.AggregatedAt, | ||
|  | 		"record_count":   e.RecordCount, | ||
|  | 		"total_value":    e.TotalValue, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 报告相关事件 ================ | ||
|  | 
 | ||
|  | // ReportCreatedEvent 报告创建事件 | ||
|  | type ReportCreatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	ReportID   string `json:"report_id"` | ||
|  | 	ReportType string `json:"report_type"` | ||
|  | 	Title      string `json:"title"` | ||
|  | 	Period     string `json:"period"` | ||
|  | 	UserRole   string `json:"user_role"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewReportCreatedEvent(reportID, reportType, title, period, userRole, correlationID string) *ReportCreatedEvent { | ||
|  | 	return &ReportCreatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(ReportCreatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   reportID, | ||
|  | 			AggregateType: "StatisticsReport", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"report_id":   reportID, | ||
|  | 				"report_type": reportType, | ||
|  | 				"user_role":   userRole, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		ReportID:   reportID, | ||
|  | 		ReportType: reportType, | ||
|  | 		Title:      title, | ||
|  | 		Period:     period, | ||
|  | 		UserRole:   userRole, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *ReportCreatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"report_id":   e.ReportID, | ||
|  | 		"report_type": e.ReportType, | ||
|  | 		"title":       e.Title, | ||
|  | 		"period":      e.Period, | ||
|  | 		"user_role":   e.UserRole, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // ReportGenerationStartedEvent 报告生成开始事件 | ||
|  | type ReportGenerationStartedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	ReportID    string `json:"report_id"` | ||
|  | 	GeneratedBy string `json:"generated_by"` | ||
|  | 	StartedAt   time.Time `json:"started_at"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewReportGenerationStartedEvent(reportID, generatedBy, correlationID string) *ReportGenerationStartedEvent { | ||
|  | 	return &ReportGenerationStartedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(ReportGenerationStartedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   reportID, | ||
|  | 			AggregateType: "StatisticsReport", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"report_id":     reportID, | ||
|  | 				"generated_by":  generatedBy, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		ReportID:    reportID, | ||
|  | 		GeneratedBy: generatedBy, | ||
|  | 		StartedAt:   time.Now(), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *ReportGenerationStartedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"report_id":     e.ReportID, | ||
|  | 		"generated_by":  e.GeneratedBy, | ||
|  | 		"started_at":    e.StartedAt, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // ReportCompletedEvent 报告完成事件 | ||
|  | type ReportCompletedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	ReportID    string `json:"report_id"` | ||
|  | 	CompletedAt time.Time `json:"completed_at"` | ||
|  | 	ContentSize int    `json:"content_size"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewReportCompletedEvent(reportID string, contentSize int, correlationID string) *ReportCompletedEvent { | ||
|  | 	return &ReportCompletedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(ReportCompletedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   reportID, | ||
|  | 			AggregateType: "StatisticsReport", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"report_id": reportID, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		ReportID:    reportID, | ||
|  | 		CompletedAt: time.Now(), | ||
|  | 		ContentSize: contentSize, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *ReportCompletedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"report_id":     e.ReportID, | ||
|  | 		"completed_at":  e.CompletedAt, | ||
|  | 		"content_size":  e.ContentSize, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // ReportFailedEvent 报告失败事件 | ||
|  | type ReportFailedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	ReportID string `json:"report_id"` | ||
|  | 	Reason   string `json:"reason"` | ||
|  | 	FailedAt time.Time `json:"failed_at"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewReportFailedEvent(reportID, reason, correlationID string) *ReportFailedEvent { | ||
|  | 	return &ReportFailedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(ReportFailedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   reportID, | ||
|  | 			AggregateType: "StatisticsReport", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"report_id": reportID, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		ReportID: reportID, | ||
|  | 		Reason:   reason, | ||
|  | 		FailedAt: time.Now(), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *ReportFailedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"report_id": e.ReportID, | ||
|  | 		"reason":    e.Reason, | ||
|  | 		"failed_at": e.FailedAt, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // ================ 仪表板相关事件 ================ | ||
|  | 
 | ||
|  | // DashboardCreatedEvent 仪表板创建事件 | ||
|  | type DashboardCreatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	DashboardID string `json:"dashboard_id"` | ||
|  | 	Name        string `json:"name"` | ||
|  | 	UserRole    string `json:"user_role"` | ||
|  | 	CreatedBy   string `json:"created_by"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewDashboardCreatedEvent(dashboardID, name, userRole, createdBy, correlationID string) *DashboardCreatedEvent { | ||
|  | 	return &DashboardCreatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(DashboardCreatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   dashboardID, | ||
|  | 			AggregateType: "StatisticsDashboard", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"dashboard_id": dashboardID, | ||
|  | 				"user_role":    userRole, | ||
|  | 				"created_by":   createdBy, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		DashboardID: dashboardID, | ||
|  | 		Name:        name, | ||
|  | 		UserRole:    userRole, | ||
|  | 		CreatedBy:   createdBy, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *DashboardCreatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"dashboard_id": e.DashboardID, | ||
|  | 		"name":         e.Name, | ||
|  | 		"user_role":    e.UserRole, | ||
|  | 		"created_by":   e.CreatedBy, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // DashboardUpdatedEvent 仪表板更新事件 | ||
|  | type DashboardUpdatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	DashboardID string `json:"dashboard_id"` | ||
|  | 	UpdatedBy   string `json:"updated_by"` | ||
|  | 	UpdatedAt   time.Time `json:"updated_at"` | ||
|  | 	Changes     map[string]interface{} `json:"changes"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewDashboardUpdatedEvent(dashboardID, updatedBy string, changes map[string]interface{}, correlationID string) *DashboardUpdatedEvent { | ||
|  | 	return &DashboardUpdatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(DashboardUpdatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   dashboardID, | ||
|  | 			AggregateType: "StatisticsDashboard", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"dashboard_id": dashboardID, | ||
|  | 				"updated_by":   updatedBy, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		DashboardID: dashboardID, | ||
|  | 		UpdatedBy:   updatedBy, | ||
|  | 		UpdatedAt:   time.Now(), | ||
|  | 		Changes:     changes, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *DashboardUpdatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"dashboard_id": e.DashboardID, | ||
|  | 		"updated_by":   e.UpdatedBy, | ||
|  | 		"updated_at":   e.UpdatedAt, | ||
|  | 		"changes":      e.Changes, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // DashboardActivatedEvent 仪表板激活事件 | ||
|  | type DashboardActivatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	DashboardID string `json:"dashboard_id"` | ||
|  | 	ActivatedBy string `json:"activated_by"` | ||
|  | 	ActivatedAt time.Time `json:"activated_at"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewDashboardActivatedEvent(dashboardID, activatedBy, correlationID string) *DashboardActivatedEvent { | ||
|  | 	return &DashboardActivatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(DashboardActivatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   dashboardID, | ||
|  | 			AggregateType: "StatisticsDashboard", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"dashboard_id": dashboardID, | ||
|  | 				"activated_by": activatedBy, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		DashboardID: dashboardID, | ||
|  | 		ActivatedBy: activatedBy, | ||
|  | 		ActivatedAt: time.Now(), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *DashboardActivatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"dashboard_id": e.DashboardID, | ||
|  | 		"activated_by": e.ActivatedBy, | ||
|  | 		"activated_at": e.ActivatedAt, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // DashboardDeactivatedEvent 仪表板停用事件 | ||
|  | type DashboardDeactivatedEvent struct { | ||
|  | 	*BaseStatisticsEvent | ||
|  | 	DashboardID   string `json:"dashboard_id"` | ||
|  | 	DeactivatedBy string `json:"deactivated_by"` | ||
|  | 	DeactivatedAt time.Time `json:"deactivated_at"` | ||
|  | } | ||
|  | 
 | ||
|  | func NewDashboardDeactivatedEvent(dashboardID, deactivatedBy, correlationID string) *DashboardDeactivatedEvent { | ||
|  | 	return &DashboardDeactivatedEvent{ | ||
|  | 		BaseStatisticsEvent: &BaseStatisticsEvent{ | ||
|  | 			ID:            uuid.New().String(), | ||
|  | 			Type:          string(DashboardDeactivatedEventType), | ||
|  | 			Version:       "1.0", | ||
|  | 			Timestamp:     time.Now(), | ||
|  | 			Source:        "statistics-service", | ||
|  | 			AggregateID:   dashboardID, | ||
|  | 			AggregateType: "StatisticsDashboard", | ||
|  | 			DomainVersion: "1.0", | ||
|  | 			CorrelationID: correlationID, | ||
|  | 			Metadata: map[string]interface{}{ | ||
|  | 				"dashboard_id":   dashboardID, | ||
|  | 				"deactivated_by": deactivatedBy, | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		DashboardID:   dashboardID, | ||
|  | 		DeactivatedBy: deactivatedBy, | ||
|  | 		DeactivatedAt: time.Now(), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (e *DashboardDeactivatedEvent) GetPayload() interface{} { | ||
|  | 	return map[string]interface{}{ | ||
|  | 		"dashboard_id":   e.DashboardID, | ||
|  | 		"deactivated_by": e.DeactivatedBy, | ||
|  | 		"deactivated_at": e.DeactivatedAt, | ||
|  | 	} | ||
|  | } |