mahjong_group/docs/1.0.0/预约时间自由选择_改动文档_甲方版.md
2026-01-01 14:39:23 +08:00

525 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 预约时间自由选择 - 需求改动文档
> 文档版本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:0015:3016:00
- [ ] 选项B以1小时为最小单位如15:0016:0017: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 | 🟠 | 🟢 | 🟢 | 🟠 |