Files
tyapi-server/internal/domains/statistics/events/statistics_events.go

573 lines
16 KiB
Go
Raw Normal View History

2025-09-12 01:15:09 +08:00
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,
}
}