package events import ( "context" "go.uber.org/zap" "tyapi-server/internal/domains/finance/events" "tyapi-server/internal/shared/interfaces" ) // InvoiceEventPublisher 发票事件发布器实现 type InvoiceEventPublisher struct { logger *zap.Logger eventBus interfaces.EventBus } // NewInvoiceEventPublisher 创建发票事件发布器 func NewInvoiceEventPublisher(logger *zap.Logger, eventBus interfaces.EventBus) *InvoiceEventPublisher { return &InvoiceEventPublisher{ logger: logger, eventBus: eventBus, } } // PublishInvoiceApplicationCreated 发布发票申请创建事件 func (p *InvoiceEventPublisher) PublishInvoiceApplicationCreated(ctx context.Context, event *events.InvoiceApplicationCreatedEvent) error { p.logger.Info("发布发票申请创建事件", zap.String("application_id", event.ApplicationID), zap.String("user_id", event.UserID), zap.String("invoice_type", string(event.InvoiceType)), zap.String("amount", event.Amount.String()), zap.String("company_name", event.CompanyName), zap.String("receiving_email", event.ReceivingEmail), ) // TODO: 实现实际的事件发布逻辑 // 例如:发送到消息队列、调用外部服务等 return nil } // PublishInvoiceApplicationApproved 发布发票申请通过事件 func (p *InvoiceEventPublisher) PublishInvoiceApplicationApproved(ctx context.Context, event *events.InvoiceApplicationApprovedEvent) error { p.logger.Info("发布发票申请通过事件", zap.String("application_id", event.ApplicationID), zap.String("user_id", event.UserID), zap.String("amount", event.Amount.String()), zap.String("receiving_email", event.ReceivingEmail), zap.Time("approved_at", event.ApprovedAt), ) // TODO: 实现实际的事件发布逻辑 // 例如:发送邮件通知用户、更新统计数据等 return nil } // PublishInvoiceApplicationRejected 发布发票申请拒绝事件 func (p *InvoiceEventPublisher) PublishInvoiceApplicationRejected(ctx context.Context, event *events.InvoiceApplicationRejectedEvent) error { p.logger.Info("发布发票申请拒绝事件", zap.String("application_id", event.ApplicationID), zap.String("user_id", event.UserID), zap.String("reason", event.Reason), zap.String("receiving_email", event.ReceivingEmail), zap.Time("rejected_at", event.RejectedAt), ) // TODO: 实现实际的事件发布逻辑 // 例如:发送邮件通知用户、记录拒绝原因等 return nil } // PublishInvoiceFileUploaded 发布发票文件上传事件 func (p *InvoiceEventPublisher) PublishInvoiceFileUploaded(ctx context.Context, event *events.InvoiceFileUploadedEvent) error { p.logger.Info("📤 开始发布发票文件上传事件", zap.String("invoice_id", event.InvoiceID), zap.String("user_id", event.UserID), zap.String("file_id", event.FileID), zap.String("file_name", event.FileName), zap.String("file_url", event.FileURL), zap.String("receiving_email", event.ReceivingEmail), zap.Time("uploaded_at", event.UploadedAt), ) // 发布到事件总线 if p.eventBus != nil { p.logger.Info("🚀 准备发布事件到事件总线", zap.String("event_type", event.GetType()), zap.String("event_id", event.GetID()), ) if err := p.eventBus.Publish(ctx, event); err != nil { p.logger.Error("❌ 发布发票文件上传事件到事件总线失败", zap.String("invoice_id", event.InvoiceID), zap.String("event_type", event.GetType()), zap.String("event_id", event.GetID()), zap.Error(err), ) return err } p.logger.Info("✅ 发票文件上传事件已发布到事件总线", zap.String("invoice_id", event.InvoiceID), zap.String("event_type", event.GetType()), zap.String("event_id", event.GetID()), ) } else { p.logger.Warn("⚠️ 事件总线未初始化,无法发布事件", zap.String("invoice_id", event.InvoiceID), ) } return nil }