feat: 订单双视图、工作台日历组件、医生排班管理与挂号语音提醒

- 订单双视图:商品订单/处方/挂号列表新增卡片视图(CardList)、视图切换组件 view-mode-switch、stat-islands 统计岛、constants 字典
- 工作台:新增工作日历 Widget、待办日历、即将到访预约、公告滚动 NoticeTicker、日历面板 CalendarPanel
- 医生排班:新增排班 API、ScheduleDrawer 抽屉、schedule-calendar 组件、门店设置弹窗
- 日志与通知:新增排班变更日志页、排班变更通知视图
- 挂号提醒:新增挂号语音播报资源与 register-notify 工具
- 桌面端:新增 apps/desktop 壳及 desktop 工具方法
- 其他:处方/订单导出、聊天设置与 WebSocket 等小幅优化
This commit is contained in:
李琦
2026-08-14 17:46:50 +08:00
parent f15bf10553
commit beba5e8feb
105 changed files with 16261 additions and 1253 deletions

View File

@@ -61,13 +61,52 @@ function handleKeyDownEnter(event: KeyboardEvent) {
if (!state?.value.submitOnEnter || !forward.value.formApi?.isMounted) {
return;
}
// 输入法组合态(打中文选词)的回车是「确认候选词」,不是提交意图
if (event.isComposing) {
return;
}
// 如果是 textarea 不阻止默认行为,否则会导致无法换行。
// 跳过 textarea 的回车提交处理
if (event.target instanceof HTMLTextAreaElement) {
return;
}
const target = event.target instanceof Element ? event.target : null;
// 焦点在按钮上(如重置/展开)时交给原生行为:回车本就会触发该按钮 click,
// 若在这里拦截成提交,会出现「聚焦重置按钮按回车却执行了查询」的错乱
if (target?.closest('button')) {
return;
}
// 下拉面板打开时回车是「选中选项」(keydown 冒泡是同步的,open class 尚未被
// Vue 异步渲染移除,此刻仍可命中),跳过提交;面板关闭后的下一次回车才提交,
// 即「下拉需要第二次回车才搜索」
if (target?.closest('.ant-select-open')) {
return;
}
// 日期/时间选择器:与 Select 一致的两段式语义——
// 面板打开时回车是「确认日期选择」(keydown 同步阶段面板 DOM 尚未被异步移除,仍可命中),跳过提交;
// 面板关闭后的下一次回车才提交,即「选完日期第二次回车即搜索」
if (target?.closest('.ant-picker')) {
const openPickerPanel = document.querySelector(
'.ant-picker-dropdown:not(.ant-picker-dropdown-hidden)',
);
if (openPickerPanel) {
return;
}
// 面板关闭态:rc-picker 的回车会重新打开面板,提交的同时主动失焦收面板,
// 避免搜索结果被日期面板挡住
event.preventDefault();
if (target instanceof HTMLElement) {
target.blur();
}
forward.value.formApi?.validateAndSubmit();
return;
}
event.preventDefault();
// 关闭态 Select 的回车会同步重新打开面板(rc-select 行为),提交的同时主动
// 失焦收起面板,避免搜索结果被下拉挡住
if (target instanceof HTMLElement && target.closest('.ant-select')) {
target.blur();
}
forward.value.formApi?.validateAndSubmit();
}