370 lines
7.6 KiB
Markdown
370 lines
7.6 KiB
Markdown
# 自动创建患者 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. 输入患者ID:10001
|
||
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 账号!** 🎉
|