新增功能

This commit is contained in:
Your Name
2026-03-04 15:32:30 +08:00
parent a07e844c47
commit ab77f5488d
2266 changed files with 177942 additions and 3444 deletions
+369
View File
@@ -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. 输入患者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 账号!** 🎉