525 lines
30 KiB
Markdown
525 lines
30 KiB
Markdown
# 预约时间自由选择 - 需求改动文档
|
||
|
||
> 文档版本:v1.0
|
||
> 更新日期:2024年
|
||
> 文档类型:甲方确认版
|
||
|
||
---
|
||
|
||
## 一、需求概述
|
||
|
||
### 1.1 当前问题
|
||
- 用户只能选择固定时段(凌晨/上午/下午/晚上),每个时段固定6小时
|
||
- 无法灵活选择具体的开始和结束时间
|
||
- 跨时段预约时,房间列表显示不够直观
|
||
|
||
### 1.2 改动目标
|
||
1. **时段显示优化**:预约15:00-20:00时,房间列表应显示"下午"和"晚上"都被预定
|
||
2. **自由时间选择**:允许用户自由选择具体的开始时间和结束时间
|
||
|
||
---
|
||
|
||
## 二、当前系统时段定义
|
||
|
||
| 时段名称 | 时间范围 | 图标颜色 |
|
||
|:--------:|:--------:|:--------:|
|
||
| 凌晨 | 00:00 - 06:00 | - |
|
||
| 上午 | 06:00 - 12:00 | - |
|
||
| 下午 | 12:00 - 18:00 | - |
|
||
| 晚上 | 18:00 - 24:00 | - |
|
||
|
||
**时段状态说明**:
|
||
- 🟢 可预约 - 该时段空闲,可以预约
|
||
- 🟠 已预约 - 该时段已被其他人预约
|
||
- ⚫ 不可用 - 该时段不开放
|
||
- 🔵 使用中 - 该时段正在使用
|
||
|
||
---
|
||
|
||
## 三、完整业务闭环
|
||
|
||
### 3.1 发起者完整闭环(创建预约→结束)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────┐
|
||
│ 发起者完整业务闭环 │
|
||
└─────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌──────────┐
|
||
│ 发起者 │
|
||
└────┬─────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 1. 选择日期 │
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 2. 选择房间 │ ←─── 查看房间时段状态
|
||
└────────┬────────┘ 🟢可预约 🟠已预约
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 3. 选择时段 │ ←─── 【改动点】改为自由选择时间
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 4. 填写预约信息 │ ←─── 标题、人数、要求等
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 5. 支付押金 │────▶│ 创建成功 │
|
||
│ (如需要) │ │ 状态:待开始 │
|
||
└─────────────────┘ └────────┬────────┘
|
||
│
|
||
┌───────────────────────┤
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 等待参与者加入 │ │ 分享给好友 │
|
||
└────────┬────────┘ └─────────────────┘
|
||
│
|
||
│ 【人满/时间到】
|
||
▼
|
||
┌─────────────────┐
|
||
│ 状态:已锁定 │ ←─── 不可再加入/退出
|
||
└────────┬────────┘
|
||
│
|
||
│ 【开始前10分钟~开始后】
|
||
▼
|
||
┌─────────────────┐
|
||
│ 6. 签到确认 ⭐ │ ←─── 确认参与者到场情况
|
||
└────────┬────────┘
|
||
│
|
||
├─────────────────────────────┐
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 参与者已到场 │ │ 参与者未到场 │
|
||
│ 信誉分 +0.2 │ │ 信誉分 -0.5 │
|
||
│ 退还押金 │ │ 鸽子数 +1 │
|
||
└────────┬────────┘ │ 押金不退 │
|
||
│ └─────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 状态:进行中 │ ←─── 预约正式开始
|
||
└────────┬────────┘
|
||
│
|
||
│ 【时间结束】
|
||
▼
|
||
┌─────────────────┐
|
||
│ 7. 互相评价 │ ←─── 牌品、牌技评分
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 状态:已结束 │ ←─── 预约完成
|
||
└─────────────────┘
|
||
```
|
||
|
||
### 3.2 参与者完整闭环(加入预约→结束)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────┐
|
||
│ 参与者完整业务闭环 │
|
||
└─────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌──────────┐
|
||
│ 参与者 │
|
||
└────┬─────┘
|
||
│
|
||
├───────────────────┬───────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||
│ 首页浏览 │ │ 好友分享 │ │ 扫码进入 │
|
||
│ 麻将局列表 │ │ 点击链接 │ │ │
|
||
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
|
||
│ │ │
|
||
└───────────────────┴───────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 1. 查看预约详情 │
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 2. 点击加入 │────▶│ 检查是否在 │
|
||
└─────────────────┘ │ 黑名单中 │
|
||
└────────┬────────┘
|
||
│
|
||
┌───────────────────────┴───────────────────┐
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 在黑名单中 │ │ 不在黑名单 │
|
||
│ 无法加入 ❌ │ └────────┬────────┘
|
||
└─────────────────┘ │
|
||
▼
|
||
┌─────────────────┐
|
||
│ 3. 支付押金 │
|
||
│ (如需要) │
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 加入成功 ✓ │
|
||
│ 等待预约开始 │
|
||
└────────┬────────┘
|
||
│
|
||
┌──────────────────────────────────────────────────┤
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 主动退出预约 │ │ 等待锁定 │
|
||
│ (锁定前可退) │ └────────┬────────┘
|
||
└────────┬────────┘ │
|
||
│ │
|
||
▼ │ 【人满/时间到】
|
||
┌─────────────────┐ ▼
|
||
│ 退还押金 │ ┌─────────────────┐
|
||
│ 退出成功 │ │ 状态:已锁定 │
|
||
└─────────────────┘ └────────┬────────┘
|
||
│
|
||
│ 【发起者签到】
|
||
▼
|
||
┌─────────────────┐
|
||
│ 4. 被签到确认 │
|
||
└────────┬────────┘
|
||
│
|
||
┌──────────────────────────────────────────────────┤
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 已到场 ✓ │ │ 未到场 ✗ │
|
||
│ 信誉分 +0.2 │ │ 信誉分 -0.5 │
|
||
│ 押金退还 │ │ 鸽子数 +1 │
|
||
└────────┬────────┘ │ 押金不退 │
|
||
│ │ 强制退出 │
|
||
│ └─────────────────┘
|
||
▼
|
||
┌─────────────────┐
|
||
│ 状态:进行中 │
|
||
└────────┬────────┘
|
||
│
|
||
│ 【时间结束】
|
||
▼
|
||
┌─────────────────┐
|
||
│ 5. 互相评价 │
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────┐
|
||
│ 状态:已结束 │
|
||
└─────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 四、签到功能详解
|
||
|
||
### 4.1 签到流程图
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[预约状态:已锁定] --> B{时间判断}
|
||
B -->|开始前10分钟内| C[显示签到按钮]
|
||
B -->|预约已开始且未结束| C
|
||
B -->|时间未到| D[签到按钮隐藏]
|
||
|
||
C --> E[发起者点击签到]
|
||
E --> F[弹出签到确认窗口]
|
||
F --> G[显示参与者列表]
|
||
|
||
G --> H{逐个确认到场}
|
||
H -->|已到场| I[标记为到场 ✓]
|
||
H -->|未到场| J[标记为缺席 ✗]
|
||
|
||
I --> K[提交签到]
|
||
J --> K
|
||
|
||
K --> L{系统处理}
|
||
L --> M[到场者:信誉+0.2,退押金]
|
||
L --> N[缺席者:信誉-0.5,扣押金,踢出]
|
||
|
||
M --> O[预约状态→进行中]
|
||
N --> O
|
||
```
|
||
|
||
### 4.2 签到界面原型
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 到场确认 │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 请确认以下参与者是否已到场: │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||
│ │ 👤 张三 │ │
|
||
│ │ ┌──────────────┐ ┌──────────────┐ │ │
|
||
│ │ │ ✓ 已到场 │ │ ✗ 未到场 │ │ │
|
||
│ │ └──────────────┘ └──────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||
│ │ 👤 李四 │ │
|
||
│ │ ┌──────────────┐ ┌──────────────┐ │ │
|
||
│ │ │ ✓ 已到场 │ │ ✗ 未到场 │ │ │
|
||
│ │ └──────────────┘ └──────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||
│ │ 👤 王五 │ │
|
||
│ │ ┌──────────────┐ ┌──────────────┐ │ │
|
||
│ │ │ ✓ 已到场 │ │ ✗ 未到场 │ │ │
|
||
│ │ └──────────────┘ └──────────────┘ │ │
|
||
│ └─────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ⚠️ 提示:标记为"未到场"的参与者将被扣除信誉分 │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────┐ │
|
||
│ │ 确认签到 │ │
|
||
│ └─────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4.3 签到规则说明
|
||
|
||
| 项目 | 说明 |
|
||
|:----:|:----:|
|
||
| **签到人** | 仅发起者可以签到 |
|
||
| **签到时间** | 预约开始前10分钟 ~ 预约结束时间 |
|
||
| **签到次数** | 每个预约只能签到一次 |
|
||
| **到场奖励** | 信誉分 +0.2(上限5分) |
|
||
| **缺席惩罚** | 信誉分 -0.5,鸽子数 +1 |
|
||
| **押金处理** | 到场者退还,缺席者不退 |
|
||
|
||
---
|
||
|
||
## 五、时间选择改动对比
|
||
|
||
### 5.1 改动前(固定时段选择)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 选择预约时段 │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ○ 凌晨 (00:00 - 06:00) │
|
||
│ │
|
||
│ ○ 上午 (06:00 - 12:00) │
|
||
│ │
|
||
│ ● 下午 (12:00 - 18:00) ← 只能选择一个完整时段 │
|
||
│ │
|
||
│ ○ 晚上 (18:00 - 24:00) │
|
||
│ │
|
||
│ ⚠️ 限制:只能选择固定6小时时段,无法自定义时间 │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 5.2 改动后(自由时间选择)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 选择预约时间 │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 开始时间 │
|
||
│ ┌───────────────────────────────────────────────────────┐ │
|
||
│ │ 15 : 00 ▼ │ │
|
||
│ └───────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 结束时间 │
|
||
│ ┌───────────────────────────────────────────────────────┐ │
|
||
│ │ 20 : 00 ▼ │ │
|
||
│ └───────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌───────────────────────────────────────────────────────┐ │
|
||
│ │ 📊 预计时长:5 小时 │ │
|
||
│ │ 📅 跨越时段:下午、晚上 │ │
|
||
│ └───────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 💡 提示:结束时间必须晚于开始时间 │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 5.3 房间列表显示对比
|
||
|
||
**场景**:某房间已被预约 15:00 - 20:00
|
||
|
||
```
|
||
【改动前】房间时段显示:
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 304包厢 │
|
||
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
|
||
│ │ 凌晨 │ │ 上午 │ │ 下午 │ │ 晚上 │ │
|
||
│ │ 🟢 │ │ 🟢 │ │ 🟠 │ │ 🟢 │ │
|
||
│ └────────┘ └────────┘ └────────┘ └────────┘ │
|
||
│ │
|
||
│ ❌ 问题:晚上时段显示为可预约,但实际18:00-20:00已被占用 │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
|
||
【改动后】房间时段显示:
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 304包厢 │
|
||
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
|
||
│ │ 凌晨 │ │ 上午 │ │ 下午 │ │ 晚上 │ │
|
||
│ │ 🟢 │ │ 🟢 │ │ 🟠 │ │ 🟠 │ │
|
||
│ └────────┘ └────────┘ └────────┘ └────────┘ │
|
||
│ │
|
||
│ ✓ 正确:下午和晚上都显示为已预约状态 │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 六、预约状态流转图
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> 待开始: 创建预约
|
||
|
||
待开始 --> 已锁定: 人满或时间临近
|
||
待开始 --> 已取消: 发起者取消
|
||
|
||
已锁定 --> 进行中: 发起者签到
|
||
已锁定 --> 已取消: 发起者取消(需扣分)
|
||
|
||
进行中 --> 已结束: 时间结束
|
||
|
||
已取消 --> [*]
|
||
已结束 --> [*]
|
||
|
||
note right of 待开始
|
||
可加入/退出
|
||
可分享
|
||
end note
|
||
|
||
note right of 已锁定
|
||
不可加入/退出
|
||
等待签到
|
||
end note
|
||
|
||
note right of 进行中
|
||
正在进行
|
||
可评价
|
||
end note
|
||
```
|
||
|
||
### 状态说明表
|
||
|
||
| 状态 | 状态码 | 可执行操作 | 说明 |
|
||
|:----:|:------:|:----------:|:----:|
|
||
| 待开始 | 0 | 加入、退出、取消、分享 | 预约创建后的初始状态 |
|
||
| 已锁定 | 1 | 签到、取消 | 人满或临近开始时间 |
|
||
| 进行中 | 2 | 评价 | 签到后预约正式开始 |
|
||
| 已结束 | 3 | 查看记录 | 预约时间结束 |
|
||
| 已取消 | 4 | 无 | 预约被取消 |
|
||
|
||
---
|
||
|
||
## 七、信誉分规则
|
||
|
||
### 7.1 信誉分变化场景
|
||
|
||
| 场景 | 分数变化 | 说明 |
|
||
|:----:|:--------:|:----:|
|
||
| 按时赴约 | +0.2 | 签到时标记为"已到场" |
|
||
| 放鸽子 | -0.5 | 签到时标记为"未到场" |
|
||
| 取消预约(锁定前) | 无变化 | 正常取消 |
|
||
| 取消预约(锁定后) | -0.3 | 临时取消扣分 |
|
||
|
||
### 7.2 信誉分等级
|
||
|
||
| 等级 | 分数范围 | 说明 |
|
||
|:----:|:--------:|:----:|
|
||
| 优秀 | 4.5 - 5.0 | 信誉极好 |
|
||
| 良好 | 4.0 - 4.4 | 信誉较好 |
|
||
| 一般 | 3.0 - 3.9 | 信誉一般 |
|
||
| 较差 | 2.0 - 2.9 | 需要注意 |
|
||
| 很差 | < 2.0 | 可能被限制 |
|
||
|
||
---
|
||
|
||
## 八、改动工作内容总结
|
||
|
||
### 8.1 前端改动
|
||
|
||
| 序号 | 页面/组件 | 改动内容 |
|
||
|:----:|:--------:|:--------:|
|
||
| 1 | 创建预约页面 | 将时段单选改为时间选择器 |
|
||
| 2 | 创建预约页面 | 增加时长计算和跨时段提示 |
|
||
| 3 | 房间列表页面 | 验证跨时段显示(可能无需改动) |
|
||
|
||
### 8.2 后端改动
|
||
|
||
| 序号 | 模块 | 改动内容 |
|
||
|:----:|:----:|:--------:|
|
||
| 1 | 预约接口 | 支持接收自定义开始/结束时间 |
|
||
| 2 | 冲突检测 | 验证跨时段冲突检测逻辑 |
|
||
|
||
### 8.3 测试验证
|
||
|
||
| 序号 | 测试场景 | 预期结果 |
|
||
|:----:|:--------:|:--------:|
|
||
| 1 | 选择15:00-20:00 | 成功,显示跨越"下午、晚上" |
|
||
| 2 | 选择20:00-15:00 | 失败,提示时间无效 |
|
||
| 3 | 房间已有15:00-20:00预约 | 下午🟠、晚上🟠 |
|
||
| 4 | 预约10:00-14:00 | 显示跨越"上午、下午" |
|
||
|
||
---
|
||
|
||
## 九、待确认问题
|
||
|
||
请甲方确认以下问题:
|
||
|
||
### 问题1:时间选择精度
|
||
- [ ] 选项A:以30分钟为最小单位(如15:00、15:30、16:00)
|
||
- [ ] 选项B:以1小时为最小单位(如15:00、16:00、17:00)
|
||
- [ ] 选项C:以15分钟为最小单位
|
||
|
||
### 问题2:跨天预约
|
||
- [ ] 是否支持跨天预约?(如23:00 - 次日02:00)
|
||
- [ ] 如支持,如何处理跨天的时段显示?
|
||
|
||
### 问题3:最短/最长预约时长
|
||
- [ ] 最短预约时长限制:____小时
|
||
- [ ] 最长预约时长限制:____小时
|
||
|
||
### 问题4:时间冲突提示
|
||
- [ ] 选项A:选择时间时实时检测冲突
|
||
- [ ] 选项B:提交时统一检测冲突
|
||
|
||
---
|
||
|
||
## 十、附录
|
||
|
||
### A. 名词解释
|
||
|
||
| 名词 | 解释 |
|
||
|:----:|:----:|
|
||
| 发起者 | 创建预约的用户 |
|
||
| 参与者 | 加入预约的其他用户 |
|
||
| 签到 | 发起者确认参与者到场情况的操作 |
|
||
| 锁定 | 预约人满或临近开始,不可再加入/退出 |
|
||
| 鸽子数 | 用户放鸽子(未到场)的累计次数 |
|
||
|
||
### B. 时段重叠判断示例
|
||
|
||
| 预约时间 | 凌晨(0-6) | 上午(6-12) | 下午(12-18) | 晚上(18-24) |
|
||
|:--------:|:---------:|:----------:|:-----------:|:-----------:|
|
||
| 02:00-05:00 | 🟠 | 🟢 | 🟢 | 🟢 |
|
||
| 05:00-08:00 | 🟠 | 🟠 | 🟢 | 🟢 |
|
||
| 10:00-14:00 | 🟢 | 🟠 | 🟠 | 🟢 |
|
||
| 15:00-20:00 | 🟢 | 🟢 | 🟠 | 🟠 |
|
||
| 22:00-02:00 | 🟠 | 🟢 | 🟢 | 🟠 |
|