# 会议出勤（Meeting Attendance）E2E 测试报告

- 模块：meeting-attendance
- 类型：E2E
- 日期：2026-01-28（PST）
- 执行器：AI Agent + Playwright MCP

## 一、测试范围
- 覆盖页面：Dashboard、Meetings 列表、Meeting 详情、QR Codes、系统签到入口、Series、Templates、Reports（单会+系列）、Users、Audit Logs、Change Password
- 关键操作：会议创建、出勤状态更新、审计日志验证

## 二、环境信息
- 前端：`http://localhost:3000`
- 后端：`http://localhost:3001/api/v1`
- 数据库：本地开发库（已迁移）
- 浏览器：Playwright MCP (Chromium)
- 设备：Desktop（默认视口）
- 执行时间：2026-01-28 21:40 ~ 21:56 PST
- 执行方式：MCP 交互式操作（未执行自动化脚本）
- storageState：浏览器已有登录态（localStorage token），未生成独立 storageState 文件

## 三、数据准备
- 使用已存在会议数据（会议列表多条）。
- 新建会议：`E2E Create Meeting 2026-01-29`
  - 时间：2026-02-15 09:00 - 10:00 (America/Los_Angeles)
  - 地点：E2E Create Room
- 出勤状态更新：在会议 `FX EC Meeting - Session 14 (01/29/2026)` 中将 `Andy Yan (fei.yan@ff.com)` 从 `Not Checked In` 改为 `Online`。

## 四、用例明细

#### 测试场景 1.1.1：会议列表可访问并加载（P0）
- 前置条件：已登录，存在会议数据
- 步骤：访问 `/meetingattendance/meetings`
- 预期结果：页面加载完成，列表有数据
- 关联 API：[001] GET /meetings
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-01-meetings-list-success.png`

#### 测试场景 1.2.1：会议详情与二维码可访问（P0）
- 前置条件：已登录，存在会议 ID
- 步骤：进入会议详情 → 打开 QR Codes 页面
- 预期结果：详情信息可见，线上/线下二维码可见
- 关联 API：[003] GET /meetings/:id
- 结果：通过
- 证据截图：
  - `testing/reports/meeting-attendance-2026-01-29-e2e/MA-03-meeting-detail-attendance-update-success.png`
  - `testing/reports/meeting-attendance-2026-01-29-e2e/MA-02-qr-codes-success.png`

#### 测试场景 1.3.1：管理员手动更新出勤状态（P0）
- 前置条件：已登录，存在参会名单
- 步骤：会议详情中将某参会人状态改为 Online
- 预期结果：统计卡片数值变化（Online +1），参会人状态更新
- 关联 API：[015] PATCH /meetings/:id/attendance/:userId
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-03-meeting-detail-attendance-update-success.png`

#### 测试场景 1.4.1：审计日志记录可见（P1）
- 前置条件：已发生出勤状态更新操作
- 步骤：访问 `/meetingattendance/audit-logs`
- 预期结果：日志列表包含最新“Manual Check-in”记录
- 关联 API：[047] GET /audit-logs，[048] GET /audit-logs/stats
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-04-audit-log-attendance-change-success.png`

#### 测试场景 1.5.1：系统签到入口可访问（P1）
- 前置条件：已登录
- 步骤：访问 `/meetingattendance/checkin`
- 预期结果：显示签到入口引导
- 关联 API：无（页面入口验证）
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-05-system-checkin-entry-success.png`

#### 测试场景 1.6.1：Dashboard 可访问并加载（P1）
- 前置条件：已登录
- 步骤：访问 `/meetingattendance/dashboard`
- 预期结果：统计卡片与系统状态可见
- 关联 API：未标注（页面统计接口未在 07-api.md 明确编号）
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-06-dashboard-success.png`

#### 测试场景 1.7.1：Series 列表可访问（P1）
- 前置条件：已登录，存在系列会议
- 步骤：访问 `/meetingattendance/series`
- 预期结果：系列列表与实例卡片可见
- 关联 API：[016] GET /series
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-07-series-list-success.png`

#### 测试场景 1.8.1：Templates 列表可访问（P1）
- 前置条件：已登录
- 步骤：访问 `/meetingattendance/templates`
- 预期结果：模板列表可见
- 关联 API：[029] GET /templates
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-08-templates-list-success.png`

#### 测试场景 1.9.1：报表 - 单会统计（P1）
- 前置条件：已登录，存在会议
- 步骤：访问 `/meetingattendance/reports` → 选择会议
- 预期结果：统计卡片与表格可见
- 关联 API：[046] GET /reports/single-meeting
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-09-reports-single-meeting-success.png`

#### 测试场景 1.9.2：报表 - 系列统计（P1）
- 前置条件：已登录，存在系列会议
- 步骤：切换 Series Report → 选择系列
- 预期结果：系列统计、分布图与排名表可见
- 关联 API：[045] GET /reports/series
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-10-reports-series-success.png`

#### 测试场景 1.10.1：用户管理页可访问（P1）
- 前置条件：已登录
- 步骤：访问 `/meetingattendance/users`
- 预期结果：用户列表与筛选项可见
- 关联 API：[034] GET /users
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-11-users-page-success.png`

#### 测试场景 1.11.1：改密码页面可访问（P2）
- 前置条件：已登录
- 步骤：访问 `/meetingattendance/settings/change-password`
- 预期结果：表单字段与按钮可见
- 关联 API：非 meeting-attendance 模块接口（平台账户模块）
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-12-change-password-success.png`

#### 测试场景 1.12.1：会议创建流程（P0）
- 前置条件：已登录
- 步骤：进入创建页填写必填项 → 提交
- 预期结果：跳转到详情页，显示新会议信息
- 关联 API：[002] POST /meetings
- 结果：通过
- 证据截图：`testing/reports/meeting-attendance-2026-01-29-e2e/MA-13-create-meeting-success.png`

#### 测试场景 1.13.1：访客签到（P0）
- 前置条件：存在可用访客签到二维码
- 步骤：打开访客签到链接 → 填写姓名/邮箱 → 提交
- 预期结果：签到成功提示
- 关联 API：[014] POST /meetings/:id/guest-checkin
- 结果：未执行（阻断）
- 阻断原因：二维码为 base64 图像，缺少解码工具获取有效签到链接；直接使用 meetingId 访问提示“Invalid check-in link”。

## 五、失败/阻断说明
- 访客签到流程未完成：缺少二维码解码工具以解析真实签到链接（仅有 base64 图片）。

## 六、资产引用
- 截图目录：`testing/reports/meeting-attendance-2026-01-29-e2e/`
- 截图清单：
  - MA-01-meetings-list-success.png
  - MA-02-qr-codes-success.png
  - MA-03-meeting-detail-attendance-update-success.png
  - MA-04-audit-log-attendance-change-success.png
  - MA-05-system-checkin-entry-success.png
  - MA-06-dashboard-success.png
  - MA-07-series-list-success.png
  - MA-08-templates-list-success.png
  - MA-09-reports-single-meeting-success.png
  - MA-10-reports-series-success.png
  - MA-11-users-page-success.png
  - MA-12-change-password-success.png
  - MA-13-create-meeting-success.png

## 七、覆盖度说明
- 覆盖页面：11 个（Dashboard/Meetings/Meeting Detail/QR/Check-in Entry/Series/Templates/Reports/Users/Audit Logs/Change Password）
- 覆盖流程：会议创建、出勤状态更新、审计记录验证
- 未覆盖：
  - 访客签到成功链路（需二维码解码或真实扫码链接）
  - 会议删除、模板删除（破坏性操作）
  - 系列会议新增/改期、批量二维码下载（ZIP/Word）
  - 参会人导入/批量管理
  - Teams 相关页面（按之前指示暂不验证）

## 八、契约一致性
- 已验证页面与文档一致：会议列表、详情、二维码、报表、审计日志
- 未验证：访客签到成功链路

## 九、流程总结
- 会议管理核心路径可用；数据加载与更新正常。
- 出勤状态更新后审计日志正确记录。
- 报表页面可输出单会与系列统计。

