2.2 KiB
挂号通话策略
已新增 server/app/common/service/AppointmentCallPolicy.php,未修改问诊方式枚举、DiagnosisLogic、校验器或聊天页面。
集成 API
AppointmentCallPolicy::resolve(int $diagnosisId, int $appointmentId = 0): array
返回固定字段:
appointment_id: intappointment_type: string|nullappointment_type_desc: stringcan_video_call: boolcan_audio_call: boolcall_disabled_reason: string
数据库查询固定用 Appointment::where('patient_id', $diagnosisId);挂号表的 patient_id 是诊单 ID,不是患者来源表 ID。显式挂号不在当前诊单的查询结果内时抛出 RuntimeException('指定挂号不存在或不属于当前诊单'),不会回退猜测另一条挂号。
未指定挂号时:一条 status=1 自动采用;多条 status=1 返回 id=0、type=null、禁止音视频、原因 请指定本次挂号。没有有效预约时,在 status=3/4 历史记录中按预约日期、时间、ID 降序选择一条;不拿取消记录作为历史回退。没有可选记录返回 id=0、type=null、描述 未挂号、禁止音视频。
沿用已有 AppointmentTypeEnum::normalizeStored:确实存在但类型为空的历史挂号兼容 video;缺少挂号不会凭空默认 video。video 可以音视频,历史 phone 只可以音频,text 及其他类型均禁止音视频。status=2 保留准确类型但禁止通话;未知状态同样禁止。没有新增 offline 或其他枚举。
无数据库验证
另提供 resolveFromAppointments(array $appointments, int $appointmentId = 0) 与 policyForAppointment(?array $appointment) 纯函数入口。前者的数组必须已限制为当前诊单的挂号。
执行:
php -l server/app/common/service/AppointmentCallPolicy.php
php server/tests/AppointmentCallPolicyTest.php
语法检查通过;34 项断言通过。测试仅加载策略和枚举,使用内存模型替身验证实际 resolve 的诊单过滤与伪造挂号 ID,完全不启动数据库或网络连接。覆盖图文、视频、历史电话、空类型、未知类型、取消状态、多条有效挂号、明确选择、按日期/时间/ID 选择历史记录和无挂号。
git diff --check 通过。