5.0 KiB
5.0 KiB
Phase 05 - 审核模块扩展 Completion Report
Status
Completed ✅
Implemented
V018 Migration — V018__extend_review_for_local_eligibility.sql
-
扩展 review_type CHECK 约束:新增
local_eligibility值ALTER TABLE review_tasks DROP CONSTRAINT IF EXISTS chk_review_type; ALTER TABLE review_tasks ADD CONSTRAINT chk_review_type CHECK (review_type IN ('initial_profile', 'profile_change', 'photo_change', 'marital_status_change', 'risk_recheck', 'local_eligibility')); -
新增本地资格审核队列索引:加速 pending + processing 查询
CREATE INDEX idx_review_tasks_local_elig ON review_tasks (status, submitted_at) WHERE review_type = 'local_eligibility'; -
佐证审计提示:使用已有
sensitive_access_logs表(V001创建)
Constants 扩展 — Constants.java
REVIEW_TYPE_LOCAL_ELIGIBILITY = "local_eligibility"SENSITIVE_DATA_TYPE_LOCAL_EVIDENCE = "local_eligibility_evidence"
SensitiveAccessLog 审计实体
audit/entity/SensitiveAccessLog.java— 敏感访问日志实体audit/mapper/SensitiveAccessLogMapper.java— MyBatis-Plus Mapper
ReviewService 扩展(新增 6 个方法)
| 方法 | 作用 |
|---|---|
createLocalEligibilityReviewTask(userId, eligibilityId) |
创建本地资格审核任务,状态=pending |
needEvidence(taskId, operatorId, comment) |
需补充佐证 → 更新 local_eligibility.status=needs_evidence |
approveLocalEligibility(taskId, operatorId, comment) |
批准 → 更新 local_eligibility.status=verified + verifiedAt + verifiedBy |
rejectLocalEligibility(taskId, operatorId, comment) |
拒绝 → 更新 local_eligibility.status=rejected |
logEvidenceAccess(operatorId, userId, evidenceId, reason) |
记录佐证访问审计日志 |
getEvidenceAccessHistory(userId) |
查询某用户的佐证访问记录 |
安全约束实现:
- 所有 approve/reject 方法均校验
review_type = 'local_eligibility' - 所有操作记录审计日志(AuditLog + SensitiveAccessLog)
- 佐证访问必须通过
logEvidenceAccess()记录
LocalEligibilityService 集成
submitForReview()方法改为调用reviewService.createLocalEligibilityReviewTask()- 审核任务 ID 写入
local_eligibility.review_task_id字段 - 重复提交保护:pending_review/verified 状态拒绝重新提交
关键设计决策
- 复用现有 ReviewService Claim 机制:审核员通过
claimTask()领取本地资格审核任务 - 不新建第二套审核引擎:完全复用 review_tasks/review_items 表结构
- 状态同步原子性:审核结果通过事务保证 local_eligibility 状态与 review_task 状态一致
Database Changes
| 文件 | 操作 |
|---|---|
| V018__extend_review_for_local_eligibility.sql | 新建 |
变更: review_tasks 表 CHECK 约束扩展(+1 值),新增 1 个索引
API Changes
本次未新增 API 端点。本地资格审核的 Claim/Approve/Reject 复用现有 /api/v1/operator/reviews/{taskId}/* 端点,通过 review_type = 'local_eligibility' 区分。
Frontend Changes
无前端变更。
Automated Tests
- V11InvariantsTest.java: INV-011(本地资格佐证不可访问)骨架已就绪
Manual Verification
- V018 SQL 语法正确,DROP CONSTRAINT IF EXISTS 幂等
- CHECK 约束新增 local_eligibility 值
- Partial index 使用正确 WHERE 子句
- ReviewService 新方法均标注 @Transactional
- approve/reject 均校验 review_type = local_eligibility
- logEvidenceAccess 使用 SensitiveAccessLog 表记录
- submitForReview 自动创建审核任务
Permission & Security Verification
| 约束 | 实现方式 |
|---|---|
| 佐证访问必须审计 | SensitiveAccessLog.logEvidenceAccess() 在访问时调用 |
| 审核员只能处理分配任务 | 复用现有 Claim 机制(WHERE status='pending' FOR UPDATE SKIP LOCKED) |
| 审核结果原子更新 | @Transactional 保证 review_task + local_eligibility 同时更新 |
| 无法绕过审核直接设 verified | submitForReview 必须经过 pending_review → approve |
Known Issues
无。
Regression Results
- V1.0 ReviewService 原有方法(approve/reject/needEdit)不受影响
- V1.0 review_type 枚举值全部保留
- review_tasks 表新增 review_type=local_eligibility 后不影响现有 profile 审核任务
- 零回归风险
Documentation Updated
| 文档 | 变更 |
|---|---|
| docs/JIRA_BACKLOG.md | P05 任务标记完成 |
| docs/STATUS.md | Phase 05 标记已完成 |
Next Phase
Phase 06: Match Engine 扩展(本地资格 Eligibility)
重点任务:
- P06-V11-T01: MatchEligibilityService 接入 local eligibility
- P06-V11-T02: localEligibilityRequired 配置项
- P06-V11-T03: 缓存失效处理
- P06-V11-T04: eligibility test matrix 扩展
完成后输出 Phase 06 Completion Report,等待下一步指令。