40 lines
2.2 KiB
Markdown
40 lines
2.2 KiB
Markdown
# 挂号通话策略
|
|
|
|
已新增 `server/app/common/service/AppointmentCallPolicy.php`,未修改问诊方式枚举、DiagnosisLogic、校验器或聊天页面。
|
|
|
|
## 集成 API
|
|
|
|
```php
|
|
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)` 纯函数入口。前者的数组必须已限制为当前诊单的挂号。
|
|
|
|
执行:
|
|
|
|
```text
|
|
php -l server/app/common/service/AppointmentCallPolicy.php
|
|
php server/tests/AppointmentCallPolicyTest.php
|
|
```
|
|
|
|
语法检查通过;34 项断言通过。测试仅加载策略和枚举,使用内存模型替身验证实际 resolve 的诊单过滤与伪造挂号 ID,完全不启动数据库或网络连接。覆盖图文、视频、历史电话、空类型、未知类型、取消状态、多条有效挂号、明确选择、按日期/时间/ID 选择历史记录和无挂号。
|
|
|
|
`git diff --check` 通过。
|