Files
danyang-match/docs/Phase-18-Completion-Report.md
T

2.3 KiB
Raw Blame History

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角色管理/敏感访问审计日志查询)