7.5 KiB
7.5 KiB
RailwaySystem R.3B Wave 3B 验收审查报告 (Mock E2E)
执行环境: MOCK DMS ONLY (严禁生产与真实Sandbox调用)
运行编号 (RUN_ID): 20260916_033500
基线 Worktree: /Users/wzb/Desktop/项目/RailwaySystem-worktrees/dms-r3
基线分支: feature/dms-r3
Wave 3A Commit: fc4898ca2f40d8ea2cd5f8914f815ae8be3faa36
系统名称: SYFJGYD学员管理系统
状态: PASS
1. 目标与执行范围
本阶段任务为 RailwaySystem R.3B 的 Wave 3B(Admin UI 与 Mock E2E 完整闭环)。在已冻结的领域模型(Accommodation、DoorAuthorization、ExternalResourceMapping、ExternalOperation)与 DMS 适配器及编排逻辑之上,实现了:
- 管理员 DMS/门禁配置与状态查看 UI(宿舍房间映射管理、门禁权限查看、操作流水审计)
- 房间外部资源与门锁映射诊断(主锁唯一性校验与告警:0 主锁或 >1 主锁均明确阻断并告警)
- 门禁状态完整生命周期展示 (
PENDING_GRANT,GRANTING,ACTIVE,PENDING_REVOKE,REVOKING,REVOKED,ERROR) - 操作流水脱敏审计(绝不向前端暴露 token、appsecret、密码明文或原始敏感请求报文)
- 手动对账入口(管理员对账必须严格遵循业务前置校验,不强行绕过规则)
- 覆盖 15 项核心业务与边界场景的端到端自动化测试
- 严格的静态代码与安全规约审查
2. 核心业务策略与冻结语义
2.1 门锁选择策略 (PRIMARY_LOCK_ONLY)
- 外部设备仅对“主门锁”(
is_primary = 1)下发临时入驻密码凭证。 - 当房间配置 0 个主门锁时:UI 呈现诊断告警
MISSING_PRIMARY,编排服务拒绝下发并标记配置错误。 - 当房间配置 >1 个主门锁时:UI 呈现诊断告警
MULTIPLE_PRIMARIES,编排服务拒绝下发并标记配置错误。 - 当房间配置 1 个主锁与多个副锁时:仅对主锁执行密码下发。
2.2 调房编排安全原则 (NEW_ACTIVE_THEN_REVOKE_OLD)
- 学员调房时,先对新房间执行门禁下发。
- 只有新房间门锁授权确认生效(
ACTIVE)后,才触发旧房间门禁权限注销(REVOKING->REVOKED)。 - 若新房间门锁下发失败,则旧房间门锁授权继续保持
ACTIVE,绝不提前吊销旧房授权,保障学员住宿安全。
2.3 业务事务独立性 (TRANSACTION_INDEPENDENCE)
- 学员报到确认(Report Confirm)与门禁授权下发解耦:DMS 网络故障或重试不导致报到业务事务回滚。
- 学员结训退房(Checkout/Plan Complete)与门禁吊销解耦:DMS 吊销失败或网络异常不导致结训退房事务回滚。
2.4 开放性业务问题保持 (OPEN QUESTIONS)
CREDENTIAL_DELIVERY_POLICY:OPEN_QUESTION(前端统一提示“凭证待业务侧安全交付方案确认”,无明文密码展示)。LEAVE_AUTO_REVOKE_POLICY:OPEN_QUESTION(学员请假不自动吊销门禁权限)。VALIDITY_WINDOW_SOURCE:BUSINESS_POLICY_REQUIRED(无真实业务起止时间时展示 WAITING_FOR_PREREQUISITE,不伪造假日期)。
3. Mock E2E 15 大场景自动化测试验证
自动化测试套件 com.ruoyi.train.dms.DmsMockE2EScenariosSuiteTest 完整覆盖以下 15 个场景:
| 序号 | 测试场景 | 预期行为与状态转移 | 测试结果 |
|---|---|---|---|
| 1 | 先 Accommodation 后 Report | Grant -> accepted -> poll success -> ACTIVE |
PASS |
| 2 | 先 Report 后 Accommodation | WAITING -> Accommodation 后 Grant -> ACTIVE |
PASS |
| 3 | 重复 Report + Reconcile x5 | 幂等控制:生成 1 条 DoorAuthorization,仅调用 1 次凭证生成 | PASS |
| 4 | Grant 外部调用失败 | Authorization 状态非 ACTIVE,生成 ERROR 操作并支持重试生成新 Operation | PASS |
| 5 | Grant 轮询超时 | 状态非 ACTIVE,保留流水记录与尝试次数 | PASS |
| 6 | 学员退训 | Revoke -> poll success -> REVOKED |
PASS |
| 7 | 培训计划完成 | Revoke -> poll success -> REVOKED |
PASS |
| 8 | 学员请假 | 保持现有授权,不自动触发 Revoke | PASS |
| 9 | 调房成功 | 先 Grant 新房 -> 新房 ACTIVE -> Revoke 旧房 -> 旧房 REVOKED |
PASS |
| 10 | 调房新房 Grant 失败 | 旧房依然保持 ACTIVE,旧房 revoke count = 0 |
PASS |
| 11 | 房间 0 主锁 | 阻断 Grant,记录配置异常 | PASS |
| 12 | 房间 2 主锁 | 阻断 Grant,记录配置异常 | PASS |
| 13 | 1 主锁 + 多副锁 | 仅对主门锁执行凭证下发 (PRIMARY_LOCK_ONLY) | PASS |
| 14 | DMS 网络故障 (报到) | 报到业务确认成功提交,DMS 异常进入重试流水,报到不回滚 | PASS |
| 15 | DMS 吊销故障 (结训) | 结训与退房业务成功提交,吊销流水记录失败,结训不回滚 | PASS |
4. UI 界面与交互验证 (10 项关键截图)
截图保存路径: docs/reports/dms-r3/mock-e2e/20260916_033500/screenshots/
01-dorm-mapping.png: 宿舍房间管理列表与外部房间资源映射配置弹窗。02-lock-mapping.png: 房间外部门锁映射列表,清晰标明主锁(Primary Lock)状态。03-auth-pending.png: 门禁权限管理列表中筛选待授权(PENDING_GRANT)状态。04-auth-active.png: 门禁权限管理列表中展示已生效(ACTIVE)状态。05-operation-history.png: 门禁操作流水详情弹窗,严格脱敏审计字段。06-manual-reconcile.png: 手动对账入口,校验业务前置条件及反馈。07-config-error-no-primary.png: 缺少主锁时的红色警告诊断提示与阻断信息。08-transfer-new-active.png: 调房操作后新房间门禁授权即刻生效展示。09-transfer-old-revoked.png: 调房操作后旧房间门禁权限完成注销展示。10-grant-failure-recoverable.png: 授权下发失败异常记录展示,允许管理员发起对账重试。
5. 安全合规审计结论
| 审查项 | 规约要求 | 实测结果 | 结论 |
|---|---|---|---|
| 明文密码持久化 | password plaintext persistence = 0 |
数据库表结构与 Mapper 无任何明文密码字段 | PASS |
| 界面敏感信息暴露 | secret UI exposure = 0 |
页面无 token、appsecret、password 展示 | PASS |
| 远程开门接口 | remote unlock callable entry = 0 |
后端无 /train/dms/remote-unlock,前端无开门按钮 |
PASS |
| 教师/学员越权访问 | Teacher/Student access = denied | @PreAuthorize 严格绑定系统管理独立权限 |
PASS |
| 手动对账前置绕过 | Cannot bypass prerequisites | 未报到/无住宿/锁配置异常均被严格拦截 | PASS |
| 操作流水脱敏 | Operation history sanitized | 仅暴露脱敏 Operation 结构体 | PASS |
| 真实 DMS 网络调用 | LIVE_DMS_REQUEST_COUNT = 0 |
默认配置 dms.enabled=false,全量执行 Mock |
PASS |
6. Runtime Migration 门禁状态
008_RUNTIME_FIRST_RUN:NOT_EXECUTED008_RUNTIME_SECOND_RUN:NOT_EXECUTED009_RUNTIME_FIRST_RUN:NOT_EXECUTED009_RUNTIME_SECOND_RUN:NOT_EXECUTED010_RUNTIME_FIRST_RUN:NOT_EXECUTED010_RUNTIME_SECOND_RUN:NOT_EXECUTED- 规约声明: 严格遵守禁止在测试环境执行真实 Kingbase 生产变更;已通过对应 Migration 契约单元测试保障语法与幂等性。
7. 最终审查结论
Wave 3B 所有后端功能、前端页面、权限控制、自动化单测、15 个 Mock E2E 场景、10 张交互截图及安全审计均已 100% 达成。
R3_WAVE3B_STATUS = PASS