Files
tyapi-server/docs/Certification域DDD重构规范.md

348 lines
14 KiB
Markdown
Raw Permalink Normal View History

2025-07-21 15:13:26 +08:00
# 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
```
#### 流程2e签宝企业认证回调
```
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
```
#### 流程4e签宝合同签署回调
```
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域的重构实施确保重构后的代码具有良好的可维护性、可扩展性和健壮性。