新增功能

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
+216
View File
@@ -0,0 +1,216 @@
# 检查用户在线状态
## 问题诊断
Web端显示:
- 后端返回的 patientUserId: `patient_2`
- 前端传入的 userId: `patient_2`
- 最终使用的 targetUserId: `patient_2`
这说明 Web端的 userId 是正确的。问题可能在于:
1. 小程序端使用了不同的 userId 格式
2. 小程序端未登录或已离线
3. 小程序端的 SDKAppID 不一致
## 解决方案
### 方案1: 检查小程序端的 userId
在小程序端添加日志,查看登录时使用的 userId:
```javascript
// 小程序端代码
const userId = `patient_${patientId}` // 确保格式一致
console.log('小程序端登录的 userId:', userId)
await TUICallKit.init({
SDKAppID: sdkAppId,
userID: userId, // 必须是 patient_2
userSig: userSig
})
console.log('TUICallKit 初始化成功,userId:', userId)
```
### 方案2: 使用测试页面验证
你已经有一个测试页面 `admin/src/views/test/patient-call.vue`,可以用它来测试:
1. 在测试页面输入患者ID: `2`
2. 点击"初始化患者端"
3. 在另一个窗口登录医生端
4. 医生端发起通话给患者ID为2的患者
5. 测试页面应该能收到来电
如果测试页面能收到来电,说明:
- Web端到Web端的通话是正常的
- 问题确实在小程序端
### 方案3: 检查小程序端的后端接口
小程序端应该有一个获取签名的接口,类似:
```javascript
// 小程序端代码
const res = await wx.request({
url: 'https://your-api.com/api/getPatientSignature',
data: {
patient_id: 2
}
})
console.log('小程序端获取的签名:', res.data)
// 应该输出: { userId: 'patient_2', userSig: 'xxx', sdkAppId: xxx }
```
**检查点:**
1. 小程序端的接口是否返回了正确的 `userId: 'patient_2'`
2. 小程序端是否使用了这个 userId 来初始化?
### 方案4: 创建后端接口检查用户在线状态
可以创建一个后端接口来查询用户是否在线:
```php
// server/app/adminapi/controller/tcm/DiagnosisController.php
/**
* @notes 检查用户在线状态
*/
public function checkUserOnline()
{
$userId = $this->request->get('user_id');
// 调用腾讯云IM REST API查询用户在线状态
$imService = new \app\common\service\TencentImService();
$result = $imService->checkUserOnline($userId);
return $this->data($result);
}
```
然后在Web端调用这个接口:
```typescript
// 发起通话前先检查用户是否在线
const checkResult = await request.get({
url: '/tcm.diagnosis/checkUserOnline',
params: { user_id: 'patient_2' }
})
console.log('用户在线状态:', checkResult)
```
## 最可能的原因
根据经验,最常见的问题是:
### 原因1: 小程序端 userId 格式不一致
**Web端使用:** `patient_2`
**小程序端使用:** `2``user_2` 或其他格式
**解决方法:**
修改小程序端代码,确保使用 `patient_{id}` 格式
### 原因2: 小程序端未保持在线
小程序在后台运行时可能会断开IM连接。
**解决方法:**
1. 确保小程序在前台运行
2. 在小程序的 `onShow` 事件中重新登录IM
3. 监听网络状态变化,断线后自动重连
### 原因3: 小程序端初始化失败
小程序端可能初始化失败但没有报错。
**解决方法:**
添加详细的错误处理:
```javascript
try {
await TUICallKit.init({
SDKAppID: sdkAppId,
userID: userId,
userSig: userSig
})
console.log('初始化成功')
} catch (error) {
console.error('初始化失败:', error)
wx.showToast({
title: '初始化失败: ' + error.message,
icon: 'none'
})
}
```
## 调试步骤
### 步骤1: 使用测试页面验证Web端
1. 打开 `http://localhost:5173/#/test/patient-call`
2. 输入患者ID: `2`
3. 点击"初始化患者端"
4. 在另一个窗口发起通话
5. 如果能收到来电,说明Web端正常
### 步骤2: 检查小程序端日志
在微信开发者工具中查看控制台日志:
```
期望看到的日志:
- 获取签名成功: { userId: 'patient_2', ... }
- TUICallKit 初始化成功
- IM 登录成功
```
### 步骤3: 对比 userId
确保两端使用的 userId 完全一致:
```
Web端发起通话: patient_2
小程序端登录: patient_2 ← 必须一致
```
### 步骤4: 检查 SDKAppID
确保两端使用相同的 SDKAppID:
```
Web端: 1400xxx
小程序端: 1400xxx ← 必须一致
```
## 快速验证方法
最快的验证方法是:
1. 打开测试页面,初始化患者ID为2
2. 在医生端发起通话
3. 如果测试页面能收到来电 → 问题在小程序端
4. 如果测试页面收不到来电 → 问题在Web端
## 需要提供的信息
为了进一步帮助你,请提供:
1. **小程序端的初始化代码**
- 如何获取 userId
- 如何初始化 TUICallKit
2. **小程序端的控制台日志**
- 初始化时的日志
- 是否有错误信息
3. **测试页面的测试结果**
- 能否收到来电
- 控制台有什么日志
4. **Web端发起通话后的完整日志**
- 是否有错误码
- 错误信息是什么