Files
railwaysystem/docs/reports/dms-r3/mock-e2e/20260916_033500/report.md
T

7.5 KiB
Raw Blame History

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 适配器及编排逻辑之上,实现了:

  1. 管理员 DMS/门禁配置与状态查看 UI(宿舍房间映射管理、门禁权限查看、操作流水审计)
  2. 房间外部资源与门锁映射诊断(主锁唯一性校验与告警:0 主锁或 >1 主锁均明确阻断并告警)
  3. 门禁状态完整生命周期展示 (PENDING_GRANT, GRANTING, ACTIVE, PENDING_REVOKE, REVOKING, REVOKED, ERROR)
  4. 操作流水脱敏审计(绝不向前端暴露 token、appsecret、密码明文或原始敏感请求报文)
  5. 手动对账入口(管理员对账必须严格遵循业务前置校验,不强行绕过规则)
  6. 覆盖 15 项核心业务与边界场景的端到端自动化测试
  7. 严格的静态代码与安全规约审查

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/

  1. 01-dorm-mapping.png: 宿舍房间管理列表与外部房间资源映射配置弹窗。
  2. 02-lock-mapping.png: 房间外部门锁映射列表,清晰标明主锁(Primary Lock)状态。
  3. 03-auth-pending.png: 门禁权限管理列表中筛选待授权(PENDING_GRANT)状态。
  4. 04-auth-active.png: 门禁权限管理列表中展示已生效(ACTIVE)状态。
  5. 05-operation-history.png: 门禁操作流水详情弹窗,严格脱敏审计字段。
  6. 06-manual-reconcile.png: 手动对账入口,校验业务前置条件及反馈。
  7. 07-config-error-no-primary.png: 缺少主锁时的红色警告诊断提示与阻断信息。
  8. 08-transfer-new-active.png: 调房操作后新房间门禁授权即刻生效展示。
  9. 09-transfer-old-revoked.png: 调房操作后旧房间门禁权限完成注销展示。
  10. 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_EXECUTED
  • 008_RUNTIME_SECOND_RUN: NOT_EXECUTED
  • 009_RUNTIME_FIRST_RUN: NOT_EXECUTED
  • 009_RUNTIME_SECOND_RUN: NOT_EXECUTED
  • 010_RUNTIME_FIRST_RUN: NOT_EXECUTED
  • 010_RUNTIME_SECOND_RUN: NOT_EXECUTED
  • 规约声明: 严格遵守禁止在测试环境执行真实 Kingbase 生产变更;已通过对应 Migration 契约单元测试保障语法与幂等性。

7. 最终审查结论

Wave 3B 所有后端功能、前端页面、权限控制、自动化单测、15 个 Mock E2E 场景、10 张交互截图及安全审计均已 100% 达成。 R3_WAVE3B_STATUS = PASS