# Kylin Medical

Kylin 智慧医疗问诊扩展包 — 预约挂号、在线问诊、电子病历、处方管理。

## 功能特性

- **预约挂号**：号源管理、排班管理、挂号/退号（24 小时退号时限）
- **在线问诊**：图文问诊、复诊验证、问诊记录
- **电子病历**：WS 445 数据集、ICD-10 编码、HMAC-SHA256 电子签名归档
- **处方管理**：电子处方、药师审核、合理用药检查（强制 7 天/3 天用量、5 种药品上限）
- **药品管理**：药品目录、特殊药品管控
- **数据安全**：患者敏感信息（过敏史、住址）加密存储 + 脱敏展示
- **审计日志**：所有关键操作（挂号/退号/开方/审方/签名/查阅）写入审计日志

## 安装

```bash
composer require kylin/medical
```

## 配置发布

```bash
php artisan vendor:publish --tag=kylin-medical-config
```

## 配置说明

```php
// config/kylin-medical.php
return [
    'consultation' => [
        'chat_timeout' => 30,        // 图文问诊超时（分钟）
        'video_timeout' => 20,       // 视频问诊超时（分钟）
    ],

    // 法律合规 - 处方配置（《处方管理办法》第七条/第十八条）
    'prescription' => [
        'normal_valid_days' => 7,             // 普通处方有效期（天）
        'emergency_valid_days' => 3,          // 急诊处方有效期（天）
        'max_items_per_prescription' => 5,    // 单张处方最大药品数
    ],

    'appointment' => [
        'cancel_before_hours' => 24,  // 退号提前时间（小时）
        'release_delay' => 300,       // 号源释放延迟（秒）
    ],

    // 法律合规 - 医疗数据加密（《个人信息保护法》第二十八条）
    'encryption' => [
        'fields' => ['phone', 'id_number', 'address', 'allergy_history'],
    ],

    // 法律合规 - 病历保存期限（《电子病历应用管理规范》第二十二条）
    'record_retention' => [
        'outpatient_years' => 15,  // 门诊病历保存年限
        'inpatient_years' => 30,   // 住院病历保存年限
    ],
];
```

## 使用示例

### Facade

```php
use Kylin\Medical\Facades\KylinMedical;

// 预约挂号
$appointment = KylinMedical::createAppointment([
    'patient_id' => 1,
    'doctor_id' => 2,
    'schedule_id' => 3,
]);

// 退号（需提前 24 小时）
KylinMedical::cancelAppointment($appointment->id, '行程变更');

// 开具处方（强制校验药品数和用量）
$prescription = KylinMedical::createPrescription([
    'medical_record_id' => 1,
    'doctor_id' => 2,
    'type' => 'normal',  // normal | emergency
    'items' => [
        ['drug_id' => 1, 'dosage' => '1片/次', 'frequency' => '每日3次', 'days' => 3],
    ],
]);

// 药师审核处方
KylinMedical::reviewPrescription($prescription->id, pharmacistId: 5, approved: true);

// 电子病历签名（HMAC-SHA256）
KylinMedical::signMedicalRecord(recordId: 1, doctorId: 2);

// 查阅患者病历（权限校验）
$records = KylinMedical::getPatientRecords(patientId: 1, currentUserId: $user->id);
```

### 服务注入

```php
use Kylin\Medical\Services\MedicalService;

public function __construct(private readonly MedicalService $medical) {}

public function prescribe(): void
{
    $this->medical->createPrescription([...]);
}
```

### API 路由

所有路由需通过 `auth:sanctum` 鉴权。

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/kylin/medical/appointments | 预约挂号 |
| DELETE | /api/kylin/medical/appointments/{id} | 退号 |
| POST | /api/kylin/medical/prescriptions | 开具处方 |
| POST | /api/kylin/medical/prescriptions/{id}/review | 药师审核 |
| POST | /api/kylin/medical/records/{id}/sign | 病历签名 |
| GET | /api/kylin/medical/patients/{patientId}/records | 查阅患者病历 |

## 数据库表

| 表名 | 说明 |
|------|------|
| `departments` | 科室表 |
| `doctors` | 医生表（含执业证书编号、互联网诊疗资质） |
| `patients` | 患者表（过敏史/住址加密存储） |
| `schedules` | 排班表 |
| `appointments` | 挂号表 |
| `consultations` | 问诊表 |
| `messages` | 问诊消息表 |
| `medical_records` | 电子病历表（WS 445 / ICD-10） |
| `drugs` | 药品目录表 |
| `prescriptions` | 处方表 |
| `prescription_items` | 处方明细表 |

## 合规要点

| 合规项 | 实现方式 | 法律依据 |
|------|------|------|
| 处方用量限制 | `createPrescription()` 强制校验 | 《处方管理办法》第七条 |
| 处方药品数上限 | `max_items_per_prescription=5` | 《处方管理办法》第十八条 |
| 药师审核 | `reviewPrescription()` 流程 | 《处方管理办法》第三十六条 |
| 敏感信息加密 | `Patient` 模型访问器/修改器 | 《个人信息保护法》第二十八条 |
| 敏感信息脱敏 | `Patient::toArray()` | 《个人信息保护法》第二十八条 |
| 电子签名 | `signMedicalRecord()` HMAC-SHA256 | 《电子病历应用管理规范》第十条 |
| 病历保存期限 | `record_retention` 配置 | 《电子病历应用管理规范》第二十二条 |
| 病历查阅权限 | `getPatientRecords()` 校验 | 《医疗机构病历管理规定》第二十八条 |
| 退号时限 | `cancelAppointment()` 校验 | 《医疗机构门诊挂号管理规范》 |
| 审计日志 | 所有关键操作写入 `kylin/audit-log` | 《网络安全法》第二十一条 |

## 审计事件

| 事件 | 说明 |
|------|------|
| `appointment_created` | 挂号创建 |
| `appointment_cancelled` | 退号 |
| `prescription_created` | 处方开具 |
| `prescription_approved` | 处方审核通过 |
| `prescription_rejected` | 处方退回 |
| `medical_record_signed` | 病历签名 |
| `medical_record_accessed` | 病历查阅 |
| `medical_record_access_denied` | 病历查阅拒绝 |

## 法律合规

详见 [LEGAL.md](./LEGAL.md)，涵盖：
- 《处方管理办法》(2007.5.1)
- 《中华人民共和国个人信息保护法》(2021.11.1) — 医疗健康敏感信息
- 《电子病历应用管理规范》(2017.4.1)
- 《医疗机构病历管理规定》(2014.1.1)
- 《中华人民共和国执业医师法》(2022.3.1)
- 《中华人民共和国电子签名法》(2005.4.1)
- 《中华人民共和国网络安全法》(2017.6.1)

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- 建议：kylin/audit-log（审计日志）

## 许可证

私有软件，未经授权禁止使用。
