新增功能
This commit is contained in:
@@ -0,0 +1,369 @@
|
||||
# 自动创建患者 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 账号!** 🎉
|
||||
Reference in New Issue
Block a user