# 挂号列表按类型筛选 ## 变更 - 仅在截图对应的 `admin/src/views/consumer/prescription/guahao.vue` 筛选区新增“挂号类型”下拉:全部、视频问诊、图文问诊。 - 类型通过现有查询和分页请求提交;点击“查询”回到第一页,“重置”同时清除类型及原有筛选条件。 - `server/app/adminapi/lists/doctor/AppointmentLists.php` 新增共享 `applyAppointmentTypeFilter`,列表、总数、状态 Tab 角标均应用相同类型过滤。计数不依赖先执行列表。 - 全部、未传参数及 null 表示不按类型限制,保留历史电话等记录。视频筛选包括明确视频类型及按 `AppointmentTypeEnum::normalizeStored` 规则默认成视频的历史 null、空串、纯空白值。图文筛选仅匹配明确图文记录。 - 非法筛选值(未知值、电话、错误大小写、带空格值、数字、布尔值、数组等)返回空结果及零计数,不默认成视频。存储的未知类型也不会由于 MySQL 默认大小写不敏感比较被当成视频。 ## 验证 从 `D:/web/zyt/admin` 运行: ```text node --test tests/appointment-type-filter.test.cjs 8 tests passed; 0 failures ``` - `server/tests/AppointmentTypeFilterSqlFixture.php` 使用实际 `AppointmentLists` 和 ThinkPHP MySQL SQL builder 生成列表、count、状态分组 SQL。数据库连接方法被替换为抛错,测试不能连接业务库。 - 测试在 Node 内存 SQLite 中执行生成的查询,仅将 MySQL `BINARY` 比较转换为 SQLite 等价的显式二进制排序。覆盖历史空值、未知/电话类型、软删除诊单、非法输入、类型与状态/医生/患者条件组合、分页及计数一致性。 - 实际 Vue setup 与实际 `usePaging` 验证选择类型后查询的请求参数、回到第一页以及重置行为;SFC 脚本与模板编译通过。 - PHP 语法检查及 `git diff --check` 通过。 未访问真实数据库或外部服务,未提交代码。前序挂号类型及 IM 聊天修改均保留;未修改其他界面或 `app/`。`.trellis/` 不存在。