Appearance
BizAppointmentPicker 预约选择
预约选择器:左侧迷你月历 + 右侧当日时段列表。月历支持 min-date / max-date 区间、workday-only(复用 BizWorkdayCalendar 的法定节假日数据口径)与自定义 disabled-date;时段列表展示容量 / 已约 / 剩余,约满与禁用自动置灰,支持单选与多选(可设上限)。适用于医院挂号、门店服务预约、会议室预订、设备 / 场地预约、回访时间选择。
与相关组件的分工
BizScheduleTime 是「按周几的固定营业排班编辑」;BizWorkdayCalendar 是「工作日判定与展示」;本组件是「具体日期 → 当日时段 → 余量」的预约选择——三者可组合:用 ScheduleTime 配置排班规则,经业务侧展开为本组件某日的时段与容量。
基础用法(静态时段)
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
当前选择:未选择;月历绿点 = 该日有可约时段,15:00-16:00 已约满置灰。
容量与按日期映射
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
key(0) 当天整体约满(月历禁用无绿点);其余日期按 booked 展示「余 N」,某时段约满单独置灰。
多时段多选(上限)
2026 年 10 月
一二三四五六日
未选择日期 · 可选 2 个时段
请先在左侧选择日期
已选 0 个时段
multiple 开启多时段勾选(再次点击取消),max=2 限制上限:已选 2 个后再点提示「最多可选择 2 个时段」;未配 capacity 的时段显示「可预约」。
仅工作日可约
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
切到 2026 年 10 月可见:周末置灰,国庆假期(10/1-10/7)同样禁用,10/10 补班日可选——与 BizWorkdayCalendar 同一套法定数据口径。
异步余量加载
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
点击日期出现「时段加载中…」,700ms 后渲染当日时段;同一天重复切换走缓存不再请求;奇数种子日 14:00-15:00 演示单时段禁用(不可约)。
表单集成与必选校验
编辑回显
2026 年 10 月
一二三四五六日
2026-10-27周二 · 选择一个时段
该日期暂无可约时段
已选 1 个时段
打开即回显:月份定位到 2026-10、日期高亮、10:00-11:00 带选中角标(异步加载完成后呈现);换选其他时段即时更新。
会议室预订(多资源切换)
2026 年 10 月
一二三四五六日
未选择日期 · 可选 2 个时段
请先在左侧选择日期
已选 0 个时段
当前资源:A101;切换会议室后已选清空、时段重新加载;仅工作日可订、每时段容量 1(约满即占)。
占用时段(booked-slots)
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
撞占拦截提示
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
按日切换占用
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
多选与容量叠加
2026 年 10 月
一二三四五六日
未选择日期 · 可选 2 个时段
请先在左侧选择日期
已选 0 个时段
占用动态释放
2026 年 10 月
一二三四五六日
未选择日期 · 选择一个时段
请先在左侧选择日期
已选 0 个时段
4 秒后 09:00-10:00 档释放,占角标消失恢复可选。
回显撞占兜底
2026 年 10 月
一二三四五六日
2026-10-26周一 · 选择一个时段
已选 2 个时段
Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| model-value / v-model | BizAppointmentSelection | null | null | 选中结果 { date, slotIds } |
| slots | BizAppointmentSlot[] | [] | 静态时段:全部日期共用一套 |
| slots-by-date | Record<string, BizAppointmentSlot[]> | — | 静态时段:按日期映射(YYYY-MM-DD 精确 > YYYY-MM 全月兜底 > slots) |
| slots-request | (date) => Promise<BizAppointmentSlot[]> | — | 异步时段数据源(优先级最高,按日拉取余量并缓存) |
| multiple | boolean | false | 多时段选择 |
| max | number | — | multiple 时最多可选时段数 |
| month | string | 当月 | 初始月份(YYYY-MM) |
| workday-only | boolean | false | 仅工作日可约(复用 BizWorkdayCalendar 法定节假日口径) |
| disabled-date | (date) => boolean | — | 额外日期禁用判定(与区间 / workday-only 叠加) |
| min-date / max-date | string | — | 可约起止日期(YYYY-MM-DD,含端点) |
| show-remaining | boolean | true | 是否展示时段剩余名额 |
| booked-slots | BizBookedSlot[] | [] | 已占时段:命中 slotId 禁用并标注「已约 · 原因(占用人)」,与 disabled / capacity 叠加 |
| booked-text | string | '已约' | 占用时段展示文案 |
| booked-tip | string | '该时段已被预约,请选择其他时段' | 撞占提示文案(点选 / 回显 / 余量刷新触发) |
| loading-text | string | '时段加载中…' | 异步加载占位文案 |
| empty-text | string | '该日期暂无可约时段' | 无时段占位文案 |
BizAppointmentSlot
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 时段标识(当日内唯一,如 '09:00-10:00') |
| label | string | 展示名(缺省取 id) |
| start / end | string | 开始 / 结束时间(HH:mm,展示用) |
| capacity | number | 容量(缺省视为不限) |
| booked | number | 已约数(与 capacity 计算剩余,booked ≥ capacity 置灰) |
| disabled | boolean | 单时段禁用(维护 / 闭诊) |
Events
| 事件名 | 参数 | 说明 |
|---|---|---|
| update:model-value / change | BizAppointmentChangePayload | null | 选中变化:{ date, slotIds, slots };清空选择时为 null |
| date-change | (date) | 选中日期变化(切换日期会先清空时段选择) |
| slots-loaded | (date, slots) | 异步时段加载完成 |
Expose
| 名称 | 类型 | 说明 |
|---|---|---|
| goToday | () => void | 回到今天(今天可约则同时选中) |
| switchMonth | (ym) => void | 切换月份(YYYY-MM) |
| getSelection | () => payload | null | 当前完整选中(含时段对象,可直接提交) |
行为要点
- 切换日期清空时段:预约语义下跨日保留时段易误提交,切日即清空(外部经
v-model重新赋值可恢复); - 静态模式日期预判:slots / slots-by-date 模式月历可预判「全满日禁用 + 绿点标记」,异步模式日期状态未知不标记;
- 数据源切换自动重置:slots / slotsByDate / slotsRequest 引用变化时清空已选与缓存(多资源切换配合
:key双保险); - 约满与禁用不可点:按钮置灰且点击无效,非弹错式打断。