# 预约时间自由选择 - 需求改动文档 > 文档版本: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 | 🟠 | 🟢 | 🟢 | 🟠 |