Files
zyt/artifacts/appointment-modes/call-policy.md
T
2026-09-09 15:47:48 +08:00

2.2 KiB

挂号通话策略

已新增 server/app/common/service/AppointmentCallPolicy.php,未修改问诊方式枚举、DiagnosisLogic、校验器或聊天页面。

集成 API

AppointmentCallPolicy::resolve(int $diagnosisId, int $appointmentId = 0): array

返回固定字段:

  • appointment_id: int
  • appointment_type: string|null
  • appointment_type_desc: string
  • can_video_call: bool
  • can_audio_call: bool
  • call_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 通过。