Files
zyt/AUTO_CREATE_PATIENT_ACCOUNT.md
T
2026-03-04 15:32:30 +08:00

370 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自动创建患者 TRTC 账号功能
## 功能说明
在新增或编辑诊单时,系统会自动为患者创建 TRTC(实时音视频)账号,这样医生就可以直接发起视频通话,无需手动创建患者账号。
## 工作流程
```
医生新增/编辑诊单
保存诊单信息
自动为患者创建 TRTC 账号
生成 UserSig(有效期180天)
保存到数据库
患者可以接听来电
```
## 实现细节
### 1. 数据库表
**表名**: `la_tcm_patient_trtc`
**字段说明**:
- `patient_id`: 患者ID(唯一)
- `user_id`: TRTC用户ID(格式:patient_{patient_id}
- `user_sig`: UserSig签名
- `sdk_app_id`: SDKAppID
- `expire_time`: 过期时间(180天后)
- `is_active`: 是否激活
- `last_login_time`: 最后登录时间
### 2. 自动创建逻辑
**触发时机**:
- 新增诊单时
- 编辑诊单时
**代码位置**:
```php
// server/app/adminapi/logic/tcm/DiagnosisLogic.php
public static function add(array $params)
{
// ... 创建诊单 ...
$model = Diagnosis::create($params);
// 自动为患者创建 TRTC 账号
self::createPatientTrtcAccount($model->patient_id);
return $model->id;
}
```
**创建规则**:
1. 检查患者是否已有 TRTC 账号
2. 如果已存在且未过期,跳过
3. 如果不存在或已过期,创建/更新账号
4. 生成 180 天有效期的 UserSig
5. 保存到数据库
### 3. 获取患者签名
**接口**: `/adminapi/tcm.diagnosis/getPatientSignature`
**逻辑**:
1. 先从数据库查询
2. 如果存在且未过期,直接返回
3. 如果不存在或已过期,重新生成并保存
**优势**:
- 减少重复生成
- 提高性能
- 统一管理
## 使用方式
### 方式 1: 自动创建(推荐)✅
1. **新增诊单**
- 进入"中医诊单"页面
- 点击"新增诊单"
- 填写患者信息
- 点击"确定"
- ✅ 系统自动为患者创建 TRTC 账号
2. **编辑诊单**
- 进入"中医诊单"页面
- 点击"编辑"
- 修改信息
- 点击"确定"
- ✅ 系统自动更新患者 TRTC 账号
3. **发起通话**
- 点击"视频通话"
- 点击"开始通话"
- ✅ 患者可以接听(如果患者端已登录)
### 方式 2: 手动测试
如果需要测试,可以使用测试页面:
1. 访问:`http://localhost:5173/#/test/patient-call`
2. 输入患者ID
3. 点击"初始化患者端"
4. 等待来电
## 数据库迁移
### 执行 SQL
```bash
mysql -u root -p your_database < server/sql/tcm_patient_trtc.sql
```
### SQL 内容
```sql
CREATE TABLE IF NOT EXISTS `la_tcm_patient_trtc` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`patient_id` int(11) NOT NULL DEFAULT '0' COMMENT '患者ID',
`user_id` varchar(100) NOT NULL DEFAULT '' COMMENT 'TRTC用户ID',
`user_sig` text COMMENT 'UserSig签名',
`sdk_app_id` int(11) NOT NULL DEFAULT '0' COMMENT 'SDKAppID',
`expire_time` int(11) NOT NULL DEFAULT '0' COMMENT '过期时间',
`is_active` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否激活',
`last_login_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后登录时间',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_patient_id` (`patient_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
## 日志记录
系统会记录账号创建/更新的日志:
```php
// 创建成功
[info] 创建患者 TRTC 账号
{
"patient_id": 10001,
"user_id": "patient_10001"
}
// 更新成功
[info] 更新患者 TRTC 账号
{
"patient_id": 10001,
"user_id": "patient_10001"
}
// 创建失败
[error] 创建患者 TRTC 账号失败
{
"patient_id": 10001,
"error": "错误信息"
}
```
**查看日志**:
```bash
tail -f server/runtime/log/info.log
tail -f server/runtime/log/error.log
```
## 优势
### 1. 自动化
- ✅ 无需手动创建患者账号
- ✅ 新增/编辑诊单时自动处理
- ✅ 减少操作步骤
### 2. 长期有效
- ✅ UserSig 有效期 180 天
- ✅ 自动检测过期并更新
- ✅ 无需频繁重新生成
### 3. 统一管理
- ✅ 所有患者账号集中管理
- ✅ 可以查询账号状态
- ✅ 可以批量更新
### 4. 性能优化
- ✅ 从数据库读取,减少计算
- ✅ 缓存机制,提高响应速度
- ✅ 按需生成,节省资源
## 注意事项
### 1. TRTC 配置
确保已配置腾讯云 TRTC
```env
# server/.env
[TRTC]
SDK_APP_ID = "你的SDKAppID"
SECRET_KEY = "你的密钥"
ENABLE = "true"
```
**注意**: 配置格式必须使用 `[TRTC]` 分组,否则无法正确读取配置。
### 2. 患者端集成
患者端需要:
- 集成 TUICallKit
- 使用患者的 UserSig 登录
- 监听来电事件
### 3. 过期处理
- UserSig 有效期 180 天
- 过期后自动重新生成
- 建议定期检查并更新
### 4. 安全性
- UserSig 包含敏感信息
- 不要在前端暴露
- 通过 API 获取
## 测试步骤
### 1. 创建诊单
```
1. 登录后台
2. 进入"中医诊单"
3. 点击"新增诊单"
4. 填写信息:
- 患者姓名:张三
- 手机号:13800138000
- 其他必填项...
5. 点击"确定"
6. ✅ 系统自动创建患者 TRTC 账号
```
### 2. 查看日志
```bash
# 查看是否创建成功
tail -f server/runtime/log/info.log | grep "TRTC"
# 应该看到:
# [info] 创建患者 TRTC 账号 {"patient_id":10001,"user_id":"patient_10001"}
```
### 3. 查询数据库
```sql
-- 查看患者 TRTC 账号
SELECT * FROM la_tcm_patient_trtc WHERE patient_id = 10001;
-- 应该看到:
-- patient_id: 10001
-- user_id: patient_10001
-- user_sig: eJw1jk...
-- expire_time: 1234567890
```
### 4. 测试通话
```
1. 打开测试页面:/test/patient-call
2. 输入患者ID10001
3. 点击"初始化患者端"
4. 在另一个窗口发起通话
5. ✅ 患者端收到来电
```
## 故障排查
### 问题 0: 新增诊单时提示"参数缺失"
**现象**:
- 新增诊单后提示:`{"code":0,"show":1,"msg":"参数缺失","data":[]}`
- 无法切换到"血糖血压记录"标签页
**原因**:
- 后端返回的数据结构不正确
- 前端无法正确获取新创建的诊单ID
**解决方案**:
已修复!后端现在返回:
```php
return $this->success('添加成功', ['id' => $result], 1, 1);
```
前端正确处理:
```javascript
if (result && result.id) {
mode.value = 'edit'
formData.value.id = result.id
// 重新获取详情
const detail = await tcmDiagnosisDetail({ id: result.id })
formData.value.patient_id = detail.patient_id
}
```
### 问题 1: 账号未创建
**检查**:
- [ ] TRTC 是否已配置?
- [ ] TRTC_ENABLE 是否为 true
- [ ] 查看错误日志
**解决**:
```bash
# 查看错误日志
tail -f server/runtime/log/error.log
# 检查配置
cat server/.env | grep TRTC
```
### 问题 2: UserSig 过期
**检查**:
```sql
SELECT
patient_id,
user_id,
FROM_UNIXTIME(expire_time) as expire_time,
CASE
WHEN expire_time < UNIX_TIMESTAMP() THEN '已过期'
ELSE '有效'
END as status
FROM la_tcm_patient_trtc;
```
**解决**:
- 重新编辑诊单
- 或手动调用 API 更新
### 问题 3: 无法接听
**检查**:
- [ ] 患者端是否已登录?
- [ ] UserSig 是否有效?
- [ ] 网络是否正常?
## 相关文档
- [测试指南](./HOW_TO_TEST.md)
- [故障排查](./admin/TROUBLESHOOTING.md)
- [关键修复](./admin/CRITICAL_FIX.md)
## 更新日志
### v1.0.0 (2024-03-02)
- ✅ 实现自动创建患者 TRTC 账号
- ✅ 新增患者 TRTC 账号表
- ✅ 实现账号缓存机制
- ✅ 添加日志记录
- ✅ 支持自动更新过期账号
---
**现在新增或编辑诊单时,系统会自动为患者创建 TRTC 账号!** 🎉