Files
tyapi-server/docs/认证流程状态管理说明.md

139 lines
4.2 KiB
Markdown
Raw Normal View History

2025-07-20 20:53:26 +08:00
# 认证流程状态管理说明
## 概述
认证流程已简化为6个主要状态移除了失败和拒绝状态使流程更加简洁和直观。
## 状态定义
### 主要状态
| 状态 | 状态码 | 中文名称 | 进度 | 说明 |
|------|--------|----------|------|------|
| `pending` | 待认证 | 0% | 等待用户提交企业信息 |
| `info_submitted` | 已提交企业信息 | 20% | 用户已提交企业信息 |
| `enterprise_verified` | 已企业认证 | 40% | 企业认证已完成 |
| `contract_applied` | 已申请合同 | 60% | 合同已申请 |
| `contract_signed` | 已签署合同 | 80% | 合同已签署 |
| `completed` | 认证完成 | 100% | 认证流程已完成 |
## 状态转换规则
### 转换流程
```
待认证 → 已提交企业信息 → 已企业认证 → 已申请合同 → 已签署合同 → 认证完成
```
### 特殊规则
- **重新提交企业信息**:在"已提交企业信息"状态时,用户可以重新提交企业信息(状态不变,但更新时间戳)
- **单向流程**:除了重新提交企业信息外,其他步骤都不能回头
- **无失败状态**:简化后的流程不包含失败和拒绝状态
## 代码结构
### 1. 状态枚举 (`enums/certification_status.go`)
```go
// 主要状态
StatusPending // 待认证
StatusInfoSubmitted // 已提交企业信息
StatusEnterpriseVerified // 已企业认证
StatusContractApplied // 已申请合同
StatusContractSigned // 已签署合同
StatusCompleted // 认证完成
```
### 2. 状态管理器 (`services/state_config.go`)
- `CertificationStateManager`:管理状态配置和转换规则
- 配置直接写在Go代码中无需外部配置文件
- 提供状态查询、转换验证、进度计算等功能
### 3. 状态机 (`services/state_machine.go`)
- `CertificationStateMachine`:执行状态转换的核心组件
- 处理状态转换的权限验证和时间戳更新
- 提供状态转换历史记录
### 4. 认证实体 (`entities/certification.go`)
- 包含状态相关的便捷方法
- 提供状态查询和验证功能
- 与状态机配合使用
## 使用方法
### 1. 创建状态机
```go
stateMachine := NewCertificationStateMachine(certRepo, logger)
```
### 2. 执行状态转换
```go
err := stateMachine.TransitionTo(
ctx,
certificationID,
enums.StatusInfoSubmitted,
true, // isUser
false, // isAdmin
metadata,
)
```
### 3. 检查状态转换权限
```go
canTransition, reason := stateMachine.CanTransition(
currentStatus,
targetStatus,
isUser,
isAdmin,
)
```
### 4. 获取进度信息
```go
progress := stateMachine.GetProgressPercentage(currentStatus)
nextStatuses := stateMachine.GetValidNextStatuses(currentStatus, isUser, isAdmin)
```
## 权限控制
### 用户权限
- 可以执行:提交企业信息、企业认证、申请合同、签署合同
- 不能执行:完成认证(系统自动执行)
### 管理员权限
- 简化后的流程不需要管理员操作
### 系统权限
- 可以执行:完成认证(自动执行)
## 时间戳管理
状态转换时会自动更新对应的时间戳字段:
| 状态 | 时间戳字段 |
|------|------------|
| `info_submitted` | `InfoSubmittedAt` |
| `enterprise_verified` | `FaceVerifiedAt` (复用) |
| `contract_applied` | `ContractAppliedAt` |
| `contract_signed` | `ContractSignedAt` |
| `completed` | `CompletedAt` |
## 扩展说明
### 添加新状态
1.`enums/certification_status.go` 中添加新状态常量
2.`services/state_config.go` 中添加状态配置
3.`entities/certification.go` 中更新相关方法
### 修改转换规则
1.`services/state_config.go``initStateConfigs()` 方法中修改转换配置
2. 更新 `NextValidStatuses` 和转换规则
### 自定义验证
在应用服务层添加业务逻辑验证,状态机只负责状态转换的权限控制。
## 注意事项
1. **状态一致性**:确保数据库中的状态与代码中的状态枚举一致
2. **权限验证**:在应用服务层进行详细的业务逻辑验证
3. **事务处理**:状态转换应在数据库事务中执行
4. **日志记录**:状态转换会自动记录日志,便于问题排查
5. **向后兼容**:如需添加新状态,注意保持向后兼容性