348 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			348 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Certification域DDD重构规范文档
 | ||
| 
 | ||
| ## 📋 概述
 | ||
| 
 | ||
| 本文档规范了certification域(企业认证域)的DDD架构重构方案,目标是实现清晰的职责划分、完善的状态管理、以及高度可维护的代码结构。
 | ||
| 
 | ||
| ## 🎯 重构目标
 | ||
| 
 | ||
| ### 业务目标
 | ||
| - 企业认证流程通过e签宝API实现
 | ||
| - 异步回调驱动的状态转换机制  
 | ||
| - 简化状态设计,专注核心业务节点
 | ||
| - 已签署合同即代表认证完成
 | ||
| 
 | ||
| ### 技术目标
 | ||
| - 符合DDD架构原则的分层设计
 | ||
| - 清晰的职责边界和依赖关系
 | ||
| - 基于CachedBaseRepositoryImpl的仓储实现
 | ||
| - 完善的事件驱动架构
 | ||
| - 强类型的状态机设计
 | ||
| 
 | ||
| ## 🏗️ 架构设计
 | ||
| 
 | ||
| ### 分层架构图
 | ||
| ```
 | ||
| ┌─────────────────────────────────────────────────┐
 | ||
| │                 表现层 (API)                      │
 | ||
| │  HTTP Controllers + Handlers                   │
 | ||
| └─────────────────────────────────────────────────┘
 | ||
|                         ↓
 | ||
| ┌─────────────────────────────────────────────────┐
 | ||
| │                 应用服务层                        │
 | ||
| │  用例协调 + DTO转换 + 事务管理                    │
 | ||
| └─────────────────────────────────────────────────┘
 | ||
|                         ↓
 | ||
| ┌─────────────────────────────────────────────────┐
 | ||
| │                 领域服务层                        │
 | ||
| │  工作流编排 + e签宝集成 + 回调处理 + 状态机        │
 | ||
| └─────────────────────────────────────────────────┘
 | ||
|                         ↓
 | ||
| ┌─────────────────────────────────────────────────┐
 | ||
| │                 领域模型层                        │
 | ||
| │  聚合根 + 实体 + 值对象 + 领域规则                │
 | ||
| └─────────────────────────────────────────────────┘
 | ||
|                         ↓
 | ||
| ┌─────────────────────────────────────────────────┐
 | ||
| │                 基础设施层                        │
 | ||
| │  仓储实现 + 外部服务 + 缓存 + 事件发布              │
 | ||
| └─────────────────────────────────────────────────┘
 | ||
| ```
 | ||
| 
 | ||
| ## 📊 状态设计
 | ||
| 
 | ||
| ### 状态枚举定义
 | ||
| ```go
 | ||
| const (
 | ||
|     // 主流程状态
 | ||
|     StatusPending              = "pending"                // 待认证
 | ||
|     StatusInfoSubmitted        = "info_submitted"         // 已提交企业信息  
 | ||
|     StatusEnterpriseVerified   = "enterprise_verified"    // 已企业认证
 | ||
|     StatusContractApplied      = "contract_applied"       // 已申请签署合同
 | ||
|     StatusContractSigned       = "contract_signed"        // 已签署合同(认证完成)
 | ||
|     
 | ||
|     // 失败状态
 | ||
|     StatusInfoRejected         = "info_rejected"          // 企业信息被拒绝
 | ||
|     StatusContractRejected     = "contract_rejected"      // 合同被拒签  
 | ||
|     StatusContractExpired      = "contract_expired"       // 合同签署超时
 | ||
| )
 | ||
| ```
 | ||
| 
 | ||
| ### 状态转换规则
 | ||
| | 当前状态 | 目标状态 | 触发条件 | 操作者 |
 | ||
| |---------|---------|----------|-------|
 | ||
| | Pending | InfoSubmitted | 用户提交企业信息 | USER |
 | ||
| | InfoSubmitted | EnterpriseVerified | e签宝认证成功回调 | SYSTEM |
 | ||
| | InfoSubmitted | InfoRejected | e签宝认证失败回调 | SYSTEM |
 | ||
| | EnterpriseVerified | ContractApplied | 用户申请合同 | USER |
 | ||
| | ContractApplied | ContractSigned | e签宝签署成功回调 | SYSTEM |
 | ||
| | ContractApplied | ContractRejected | e签宝拒签回调 | SYSTEM |
 | ||
| | ContractApplied | ContractExpired | 签署超时 | SYSTEM |
 | ||
| | InfoRejected | InfoSubmitted | 用户重新提交 | USER |
 | ||
| | ContractRejected | EnterpriseVerified | 重置状态 | SYSTEM |
 | ||
| | ContractExpired | EnterpriseVerified | 重置状态 | SYSTEM |
 | ||
| 
 | ||
| ## 📁 文件结构规范
 | ||
| 
 | ||
| ### 目录结构
 | ||
| ```
 | ||
| internal/domains/certification/
 | ||
| ├── entities/                                    # 实体层
 | ||
| │   ├── certification.go                         # 认证聚合根
 | ||
| │   ├── enterprise_info_submit_record.go         # 企业信息提交记录
 | ||
| │   ├── esign_contract_generate_record.go        # 合同生成记录
 | ||
| │   ├── esign_contract_sign_record.go            # 合同签署记录
 | ||
| │   └── value_objects/                           # 值对象
 | ||
| │       ├── enterprise_info.go                   # 企业信息
 | ||
| │       └── contract_info.go                     # 合同信息
 | ||
| ├── enums/                                       # 枚举定义
 | ||
| │   ├── certification_status.go                 # 认证状态
 | ||
| │   ├── failure_reason.go                       # 失败原因
 | ||
| │   └── actor_type.go                           # 操作者类型
 | ||
| ├── specifications/                             # 规格模式
 | ||
| │   └── certification_specifications.go         # 认证规格
 | ||
| ├── services/                                   # 领域服务
 | ||
| │   ├── certification_aggregate_service.go      # 聚合服务
 | ||
| │   ├── enterprise_verification_service.go      # 企业验证服务
 | ||
| │   ├── contract_management_service.go          # 合同管理服务
 | ||
| │   ├── certification_workflow_orchestrator.go # 工作流编排器
 | ||
| │   ├── state_machine/                         # 状态机
 | ||
| │   │   ├── certification_state_machine.go     # 状态机核心
 | ||
| │   │   ├── state_config.go                    # 状态配置
 | ||
| │   │   └── esign_callback_handler.go          # 回调处理器
 | ||
| │   └── factories/                             # 工厂模式
 | ||
| │       └── certification_factory.go           # 认证工厂
 | ||
| ├── repositories/                              # 仓储接口
 | ||
| │   ├── certification_command_repository.go    # 命令仓储
 | ||
| │   ├── certification_query_repository.go      # 查询仓储
 | ||
| │   ├── enterprise_info_repository.go          # 企业信息仓储
 | ||
| │   ├── contract_record_repository.go          # 合同记录仓储
 | ||
| │   └── queries/                              # 查询对象
 | ||
| │       ├── certification_queries.go          # 认证查询
 | ||
| │       └── list_certifications_query.go      # 列表查询
 | ||
| └── events/                                   # 领域事件
 | ||
|     ├── certification_events.go              # 事件定义
 | ||
|     └── event_handlers/                       # 事件处理器
 | ||
|         ├── certification_event_handler.go   # 认证事件处理
 | ||
|         └── notification_event_handler.go    # 通知处理
 | ||
| ```
 | ||
| 
 | ||
| ## 🔧 各层接口规范
 | ||
| 
 | ||
| ### 1. 聚合根接口 (certification.go)
 | ||
| ```go
 | ||
| type Certification struct {
 | ||
|     // 聚合根必须实现的核心方法
 | ||
|     
 | ||
|     // 状态转换
 | ||
|     CanTransitionTo(targetStatus CertificationStatus, actor ActorType) bool
 | ||
|     TransitionTo(targetStatus CertificationStatus, actor ActorType, reason string) error
 | ||
|     
 | ||
|     // 业务操作  
 | ||
|     SubmitEnterpriseInfo(info EnterpriseInfo) error
 | ||
|     ApplyContract() error
 | ||
|     HandleEsignCallback(callbackType string, success bool, data map[string]interface{}) error
 | ||
|     
 | ||
|     // 业务规则验证
 | ||
|     ValidateBusinessRules() error
 | ||
|     ValidateInvariance() error
 | ||
|     
 | ||
|     // 查询方法
 | ||
|     GetProgress() int
 | ||
|     IsUserActionRequired() bool
 | ||
|     GetAvailableActions() []string
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 2. 领域服务接口规范
 | ||
| 
 | ||
| #### 聚合服务
 | ||
| ```go
 | ||
| type CertificationAggregateService interface {
 | ||
|     // 聚合管理
 | ||
|     CreateCertification(ctx context.Context, userID string) (*entities.Certification, error)
 | ||
|     LoadCertification(ctx context.Context, id string) (*entities.Certification, error)
 | ||
|     SaveCertification(ctx context.Context, cert *entities.Certification) error
 | ||
|     
 | ||
|     // 状态管理
 | ||
|     TransitionState(ctx context.Context, cert *entities.Certification, targetStatus enums.CertificationStatus, actor enums.ActorType, metadata map[string]interface{}) error
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| #### 工作流编排器
 | ||
| ```go
 | ||
| type CertificationWorkflowOrchestrator interface {
 | ||
|     // 用户操作用例
 | ||
|     SubmitEnterpriseInfo(ctx context.Context, cmd *SubmitEnterpriseInfoCommand) (*WorkflowResult, error)
 | ||
|     ApplyContract(ctx context.Context, cmd *ApplyContractCommand) (*WorkflowResult, error)
 | ||
|     
 | ||
|     // e签宝回调处理
 | ||
|     HandleEnterpriseVerificationCallback(ctx context.Context, cmd *EsignCallbackCommand) error
 | ||
|     HandleContractSignCallback(ctx context.Context, cmd *EsignCallbackCommand) error
 | ||
|     
 | ||
|     // 异常处理
 | ||
|     HandleFailure(ctx context.Context, certificationID string, failureType string, reason string) error
 | ||
|     RetryOperation(ctx context.Context, certificationID string, operation string) error
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 3. 仓储接口规范
 | ||
| 
 | ||
| #### 命令仓储
 | ||
| ```go
 | ||
| type CertificationCommandRepository interface {
 | ||
|     Create(ctx context.Context, cert entities.Certification) error
 | ||
|     Update(ctx context.Context, cert entities.Certification) error
 | ||
|     UpdateStatus(ctx context.Context, id string, status enums.CertificationStatus) error
 | ||
|     Delete(ctx context.Context, id string) error
 | ||
|     
 | ||
|     // 事务支持
 | ||
|     WithTx(tx interfaces.Transaction) CertificationCommandRepository
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| #### 查询仓储
 | ||
| ```go
 | ||
| type CertificationQueryRepository interface {
 | ||
|     GetByID(ctx context.Context, id string) (*entities.Certification, error)
 | ||
|     GetByUserID(ctx context.Context, userID string) (*entities.Certification, error)
 | ||
|     List(ctx context.Context, query *queries.ListCertificationsQuery) ([]*entities.Certification, int64, error)
 | ||
|     
 | ||
|     // 业务查询
 | ||
|     GetPendingCertifications(ctx context.Context) ([]*entities.Certification, error)
 | ||
|     GetExpiredContracts(ctx context.Context) ([]*entities.Certification, error)
 | ||
|     GetStatistics(ctx context.Context, period TimePeriod) (*CertificationStats, error)
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 4. 应用服务接口规范
 | ||
| ```go
 | ||
| type CertificationApplicationService interface {
 | ||
|     // 用户操作用例
 | ||
|     CreateCertification(ctx context.Context, cmd *commands.CreateCertificationCommand) (*responses.CertificationResponse, error)
 | ||
|     SubmitEnterpriseInfo(ctx context.Context, cmd *commands.SubmitEnterpriseInfoCommand) (*responses.CertificationResponse, error)
 | ||
|     ApplyContract(ctx context.Context, cmd *commands.ApplyContractCommand) (*responses.ContractSignUrlResponse, error)
 | ||
|     
 | ||
|     // 查询用例  
 | ||
|     GetCertification(ctx context.Context, query *queries.GetCertificationQuery) (*responses.CertificationResponse, error)
 | ||
|     ListCertifications(ctx context.Context, query *queries.ListCertificationsQuery) (*responses.CertificationListResponse, error)
 | ||
|     
 | ||
|     // e签宝回调处理
 | ||
|     HandleEsignCallback(ctx context.Context, cmd *commands.EsignCallbackCommand) error
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ## 🔄 业务流程规范
 | ||
| 
 | ||
| ### 主要业务流程
 | ||
| 
 | ||
| #### 流程1:用户提交企业信息
 | ||
| ```
 | ||
| HTTP Request → Application Service → Workflow Orchestrator → Aggregate Service → Domain Entity → State Machine → Repository → Event Publishing
 | ||
| ```
 | ||
| 
 | ||
| #### 流程2:e签宝企业认证回调
 | ||
| ```  
 | ||
| HTTP Callback → Application Service → Workflow Orchestrator → Esign Callback Handler → Aggregate Service → State Machine → Repository → Event Publishing
 | ||
| ```
 | ||
| 
 | ||
| #### 流程3:用户申请合同签署
 | ||
| ```
 | ||
| HTTP Request → Application Service → Workflow Orchestrator → Contract Management Service → Aggregate Service → State Machine → Repository → Return Sign URL
 | ||
| ```
 | ||
| 
 | ||
| #### 流程4:e签宝合同签署回调
 | ||
| ```
 | ||
| HTTP Callback → Application Service → Workflow Orchestrator → Esign Callback Handler → Aggregate Service → State Machine → Repository → Event Publishing
 | ||
| ```
 | ||
| 
 | ||
| ## 📝 编码规范
 | ||
| 
 | ||
| ### 命名规范
 | ||
| - **接口**: 以`Interface`或不带后缀结尾,如`CertificationRepository`
 | ||
| - **实现类**: 以`Impl`结尾,如`CertificationRepositoryImpl`  
 | ||
| - **领域服务**: 以`Service`结尾,如`CertificationAggregateService`
 | ||
| - **DTO**: 以`Command`、`Query`、`Response`结尾
 | ||
| - **事件**: 以`Event`结尾,如`CertificationCreatedEvent`
 | ||
| 
 | ||
| ### 错误处理规范
 | ||
| - 使用领域特定的错误类型
 | ||
| - 错误消息必须使用中文
 | ||
| - 包含足够的上下文信息
 | ||
| - 支持错误链追踪
 | ||
| 
 | ||
| ### 日志规范
 | ||
| - 关键业务操作必须记录日志
 | ||
| - 日志消息使用中文
 | ||
| - 包含关键业务标识符(用户ID、认证ID等)
 | ||
| - 使用结构化日志格式
 | ||
| 
 | ||
| ### 缓存规范
 | ||
| - 查询仓储使用CachedBaseRepositoryImpl
 | ||
| - 根据查询频率选择合适的缓存策略
 | ||
| - 写操作自动失效相关缓存
 | ||
| - 支持手动缓存刷新
 | ||
| 
 | ||
| ## 🧪 测试规范
 | ||
| 
 | ||
| ### 单元测试
 | ||
| - 每个领域服务必须有单元测试
 | ||
| - 状态机转换逻辑必须全覆盖测试
 | ||
| - 业务规则验证必须有测试
 | ||
| - Mock外部依赖
 | ||
| 
 | ||
| ### 集成测试  
 | ||
| - e签宝回调处理的集成测试
 | ||
| - 完整业务流程的端到端测试
 | ||
| - 数据库操作的集成测试
 | ||
| 
 | ||
| ## 📊 监控规范
 | ||
| 
 | ||
| ### 业务指标
 | ||
| - 认证申请创建数量
 | ||
| - 企业认证成功/失败率
 | ||
| - 合同签署成功/失败率
 | ||
| - 各状态的停留时间
 | ||
| 
 | ||
| ### 技术指标
 | ||
| - 缓存命中率
 | ||
| - API响应时间
 | ||
| - 数据库查询性能
 | ||
| - 错误率和类型分布
 | ||
| 
 | ||
| ## 🚀 部署规范
 | ||
| 
 | ||
| ### 配置管理
 | ||
| - 环境相关配置外部化
 | ||
| - e签宝API配置独立管理
 | ||
| - 缓存配置可调整
 | ||
| - 日志级别可配置
 | ||
| 
 | ||
| ### 数据迁移
 | ||
| - 状态枚举的兼容性迁移
 | ||
| - 历史数据的清理策略
 | ||
| - 缓存预热脚本
 | ||
| 
 | ||
| ## 📋 验收标准
 | ||
| 
 | ||
| ### 功能验收
 | ||
| - [ ] 完整的企业认证流程正常运行
 | ||
| - [ ] e签宝回调正确处理
 | ||
| - [ ] 状态转换严格按照规则执行
 | ||
| - [ ] 异常情况正确处理和恢复
 | ||
| 
 | ||
| ### 技术验收  
 | ||
| - [ ] 各层职责清晰,无逻辑泄漏
 | ||
| - [ ] 代码符合DDD架构原则
 | ||
| - [ ] 缓存策略有效,性能提升明显
 | ||
| - [ ] 事件驱动架构正常工作
 | ||
| 
 | ||
| ### 质量验收
 | ||
| - [ ] 单元测试覆盖率 > 80%
 | ||
| - [ ] 集成测试通过
 | ||
| - [ ] 代码质量检查通过
 | ||
| - [ ] 性能指标达标
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| 本规范文档将指导整个certification域的重构实施,确保重构后的代码具有良好的可维护性、可扩展性和健壮性。  |