Appointment Board & Management | 更新时间: 2026-02-09
appointments/board/page.tsx,
appointments/realtime/page.tsx,
appointments/[id]/page.tsx,
appointments/create/new/page.tsx,
admin/appointments/page.tsx,
QuickBookingForm/index.tsx (主创建入口),
QuickBookingForm/GuestForm.tsx,
QuickBookingForm/ServiceForm.tsx,
QuickBookingForm/ServiceTable.tsx,
QuickBookingForm/AddNoteModal.tsx,
QuickBookingForm/ValidationModal.tsx,
AppointmentDetailModal.tsx,
AppointmentDrawer.tsx,
AppointmentBoardFixed.tsx
NewAppointmentModal.tsx(5 步向导流程)已不再使用。当前唯一的预约创建入口是 QuickBookingForm(三列布局表单)。
| CUJ | 优先级 | 描述 | 触发点 | 业务价值 | E2E 状态 |
|---|---|---|---|---|---|
| CUJ-B1 | P0 | 查看预约看板 | 登录后默认页面 | 核心运营视图,技师排班一目了然 | 已覆盖 |
| CUJ-B2 | P0 | 快速创建预约 | 看板上点击时段或拖拽 | 核心营收路径 — 前台快速下单 | 部分覆盖 |
| CUJ-B3 | P0 | 查看/编辑预约详情 | 看板上点击预约卡片 | 前台核对服务内容、修改细节 | 部分覆盖 |
| CUJ-B4 | P0 | 预约状态流转 | 客人到店 → 服务中 → 待支付 → 已支付 → 日结锁定 | 运营效率,流程标准化,与支付/日结联动 | 部分覆盖 |
| CUJ-B5 | P1 | 实时排队看板 | 访问 /appointments/realtime | 门店大屏展示,客户等候信息 | 已覆盖 |
| CUJ-B6 | P1 | 取消/改期预约 | 详情弹窗中操作 | 灵活调整,减少爽约 | 缺失 |
| 测试文件 | 覆盖的 CUJ | 测试场景 |
|---|---|---|
| appointments.spec.ts | B1, B3 | 预约列表加载、看板渲染、预约卡片 |
| appointment-board-schedule.spec.ts | B1 | 看板日程视图、技师列排列 |
| booking-wizard.spec.ts | B2 | 创建预约流程(注: 测试的是旧向导,需更新为 QuickBookingForm) |
| full-flow/03-appointments.spec.ts | B1, B2, B3, B4 | 完整预约管理流程 |
| queue-display.spec.ts | B5 | 实时排队看板显示 |
P0 核心运营视图 — 按技师列展示预约,支持日期和门店筛选
flowchart TD
A["登录成功"] --> B["/appointments/board"]
B --> C["加载预约数据"]
C --> D["看板按技师列展示"]
D --> E{"切换日期?"}
E -->|"是"| F["日期选择器"]
F --> C
E -->|"否"| G{"切换门店?"}
G -->|"是"| H["StoreSelector 下拉"]
H --> C
G -->|"否"| I{"操作?"}
I -->|"点击时段"| J["打开 QuickBookingForm"]
I -->|"点击卡片"| K["打开 AppointmentDetailModal"]
style B fill:#2196F3,stroke:#1565C0,color:#fff
style D fill:#4CAF50,stroke:#2E7D32,color:#fff
测试: appointments.spec.ts (已有)
测试: appointment-board-schedule.spec.ts (已有)
center_id 更新
测试: 缺失 — 需新增
测试: 缺失 — 需新增
P0 前台快速下单 — 通过 QuickBookingForm 三列布局创建预约
flowchart TD
A["看板上点击时段/拖拽"] --> B["打开 QuickBookingForm"]
B --> C["左栏: 搜索或新建 Guest"]
C --> D["中栏: 选择 Service"]
D --> E["自动填充 Price/Duration"]
E --> F["选择 Stylist"]
F --> G["选择 Start 时间"]
G --> H["点击 Add Service"]
H --> I["右栏: 服务出现在表格中"]
I --> J{"添加更多服务?"}
J -->|"是"| D
J -->|"否"| K{"添加备注?"}
K -->|"是"| L["点击 Add Note"]
K -->|"否"| M["点击 Save"]
M --> N{"时间冲突?"}
N -->|"是"| O["ValidationModal 显示冲突"]
O --> P{"强制创建?"}
P -->|"是"| Q["提交预约"]
P -->|"否"| G
N -->|"否"| Q
Q --> R["看板自动刷新"]
style B fill:#2196F3,stroke:#1565C0,color:#fff
style R fill:#4CAF50,stroke:#2E7D32,color:#fff
style O fill:#FF9800,stroke:#E65100,color:#fff
测试: full-flow/03-appointments.spec.ts (部分覆盖)
测试: 缺失 — 需新增
ExtraServiceSelection 组件已存在(在已弃用的 NewAppointmentModal 中),需要将附加服务功能集成到 ServiceForm 中。
测试: 待实现 — 前端功能待开发
测试: 缺失 — 需新增
测试: 缺失 — 需新增
测试: 缺失 — 需新增
checked_in 状态测试: booking/walk-in.spec.ts (已有)
P0 前台核对 — 查看预约详细信息并修改
测试: appointments.spec.ts (已有)
测试: 缺失 — 需新增
测试: full-flow/03-appointments.spec.ts (部分覆盖)
P0 运营流程 — 完整的 10 状态生命周期,跨 B/F/C 三个模块联动
flowchart LR
A["pending"] -->|"确认"| B["confirmed"]
B -->|"客人到店"| C["checked_in"]
C -->|"开始服务"| D["in_progress"]
D -->|"服务完成"| E["completed"]
E -->|"部分收款"| F["pending_payment"]
E -->|"全额收款"| G["finished"]
F -->|"补齐收款"| G
G -->|"日结锁定"| H["closed"]
A -->|"取消"| I["cancelled"]
B -->|"取消"| I
E -->|"取消"| I
A -->|"未到店"| J["no_show"]
B -->|"未到店"| J
G -->|"部分退款"| F
G -->|"全额退款"| E
style A fill:#87CEEB,stroke:#1565C0,color:#333
style B fill:#2196F3,stroke:#1565C0,color:#fff
style C fill:#FF9800,stroke:#E65100,color:#fff
style D fill:#9C27B0,stroke:#6A1B9A,color:#fff
style E fill:#FFD54F,stroke:#F9A825,color:#333
style F fill:#FFC107,stroke:#F9A825,color:#333
style G fill:#4CAF50,stroke:#2E7D32,color:#fff
style H fill:#37474F,stroke:#263238,color:#fff
style I fill:#f44336,stroke:#c62828,color:#fff
style J fill:#607D8B,stroke:#455A64,color:#fff
| 状态 | 含义 | 触发方式 | 关联模块 |
|---|---|---|---|
pending | 待确认(含原 "new" 状态) | 预约刚创建 | B2 |
confirmed | 已确认 | 管理员确认 / 在线预约自动确认 | B2 |
checked_in | 已签到(客人到店) | 签到按钮 / 自助终端签到 | B4, G2 |
in_progress | 服务进行中 | 技师开始服务 | B4 |
completed | 服务完成(未支付) | 技师完成服务 | → CUJ-F1 |
pending_payment | 部分支付,仍有欠款 | 部分收款或部分退款后 | → CUJ-F1 |
finished | 已结账(全额支付) | 收款完成 | ← CUJ-F1 |
closed | 已锁定(日结清点后) | 日结流程完成,数据不可修改 | ← CUJ-C1 |
cancelled | 已取消 | 管理员或客户取消 | B6 |
no_show | 爽约/未到店 | 管理员标记 | B4 |
completed/pending_payment → 进入 CUJ-F (支付) 的结账流程;
closed ← 由 CUJ-C (日结) 触发锁定;
finished 退款后回退为 pending_payment 或 completed(见 CUJ-F3 (退款))。
confirmedchecked_in,卡片颜色变为橙色in_progress,卡片颜色变为紫色pending_payment,卡片颜色变为黄色测试: full-flow/03-appointments.spec.ts (部分覆盖 — 缺 pending_payment 验证)
confirmed,已过预约时间no_show测试: 缺失 — 需新增
P1 门店展示 — 大屏显示当前等候和服务中的客户
/appointments/realtime测试: queue-display.spec.ts (已有)
P1 灵活调整 — 取消或改期已有预约
confirmedcancelled测试: 缺失 — 需新增
测试: 缺失 — 需新增