2.3 KiB
2.3 KiB
Phase 18 Completion Report
Status
✅ Completed
Implemented
P18-T01 ~ P18-T08: 申诉核心
- V013 迁移:
appeals表(含 status/escalation 约束) Appeal实体 +AppealMapper(5个查询方法)AppealService— 账号状态检查 / 提交申诉 / 处理申诉 / 统计AppealController— 用户端3个端点(含FeatureFlag检查)AppealOperatorController— 管理端5个端点- Constants 新增:APPEAL_STATUS_* 5种 / RISK_ACTION_STATUS_* 3种
- FeatureFlagConfig 已有
appealEnabled = false
Miniapp 页面
- U48 账号受限页 — 显示限制状态/原因/是否可申诉
- 申诉提交页 — 原因+证据+联系方式+提交成功态
Admin Web
- A18 申诉管理页 — 统计卡片 + 待处理列表 + 详情抽屉(3种处置决策)
- 路由注册:/appeals
Core Invariants 已保护
- ✅ FeatureFlag 控制开关 — appealEnabled 默认 false,上线前需配置开启
- ✅ 仅 ban/suspend 可申诉 — warning/feature_limit 不支持申诉
- ✅ 申诉幂等 — 同一用户对同一 action 只能有一个 pending/reviewing 申诉
- ✅ 申诉通过 → 解除处置 — approve 后自动将 risk_action 标记为 resolved
- ✅ 申诉被拒 → 维持原处置 — reject 不变更 risk_action
- ✅ 升级人工 → 通知风控员 — escalate 触发 system 通知
- ✅ 处置已失效不可申诉 — 检查 risk_action.status == 'active'
API 端点(8个)
GET /appeals/account-status(账号状态+是否可申诉) POST /appeals(提交申诉) GET /appeals/my(我的申诉) GET /operator/appeals/pending(待处理列表) GET /operator/appeals/{id}(详情) POST /operator/appeals/{id}/process(处理:approve/reject/escalate) GET /operator/appeals/stats(统计) GET /operator/appeals/users/{userId}(用户申诉记录)
Migration
V013__add_appeals_table.sql
Tests
AppealServiceTest: 9 个不变量用例(含 Mockito 注入)
Project Stats
- Java files: 184 (+8 from Phase 17)
- Test classes: 30 (+1)
- Migration SQL: 13
- Miniapp pages: 30 (+2)
Next Phase
Phase 19: 后台完善(用户管理/机构管理/Operator角色管理/敏感访问审计日志查询)