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

7.6 KiB
Raw Blame History

自动创建患者 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. 自动创建逻辑

触发时机:

  • 新增诊单时
  • 编辑诊单时

代码位置:

// 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

mysql -u root -p your_database < server/sql/tcm_patient_trtc.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;

日志记录

系统会记录账号创建/更新的日志:

// 创建成功
[info] 创建患者 TRTC 账号
{
  "patient_id": 10001,
  "user_id": "patient_10001"
}

// 更新成功
[info] 更新患者 TRTC 账号
{
  "patient_id": 10001,
  "user_id": "patient_10001"
}

// 创建失败
[error] 创建患者 TRTC 账号失败
{
  "patient_id": 10001,
  "error": "错误信息"
}

查看日志:

tail -f server/runtime/log/info.log
tail -f server/runtime/log/error.log

优势

1. 自动化

  • 无需手动创建患者账号
  • 新增/编辑诊单时自动处理
  • 减少操作步骤

2. 长期有效

  • UserSig 有效期 180 天
  • 自动检测过期并更新
  • 无需频繁重新生成

3. 统一管理

  • 所有患者账号集中管理
  • 可以查询账号状态
  • 可以批量更新

4. 性能优化

  • 从数据库读取,减少计算
  • 缓存机制,提高响应速度
  • 按需生成,节省资源

注意事项

1. TRTC 配置

确保已配置腾讯云 TRTC

# 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. 查看日志

# 查看是否创建成功
tail -f server/runtime/log/info.log | grep "TRTC"

# 应该看到:
# [info] 创建患者 TRTC 账号 {"patient_id":10001,"user_id":"patient_10001"}

3. 查询数据库

-- 查看患者 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

解决方案: 已修复!后端现在返回:

return $this->success('添加成功', ['id' => $result], 1, 1);

前端正确处理:

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
  • 查看错误日志

解决:

# 查看错误日志
tail -f server/runtime/log/error.log

# 检查配置
cat server/.env | grep TRTC

问题 2: UserSig 过期

检查:

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 是否有效?
  • 网络是否正常?

相关文档

更新日志

v1.0.0 (2024-03-02)

  • 实现自动创建患者 TRTC 账号
  • 新增患者 TRTC 账号表
  • 实现账号缓存机制
  • 添加日志记录
  • 支持自动更新过期账号

现在新增或编辑诊单时,系统会自动为患者创建 TRTC 账号! 🎉