# 自动创建患者 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 账号!** 🎉