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

338 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 修复管理员ID获取问题
## 问题描述
`DiagnosisLogic.php` 中,多个方法尝试通过 `request()->adminInfo['user_id']` 获取当前登录管理员的ID,但这个方式获取到的值为空。
### 错误代码示例
```php
// ❌ 错误的方式
$adminId = request()->adminInfo['user_id'] ?? 0; // 返回 0
```
## 问题原因
1. **键名错误**:管理员信息中的ID键名是 `admin_id`,不是 `user_id`
2. **访问方式错误**Logic层不应该直接访问 `request()` 对象
3. **架构问题**:应该由Controller层传递参数到Logic层
### BaseAdminController 的实现
```php
class BaseAdminController extends BaseLikeAdminController
{
protected int $adminId = 0;
protected array $adminInfo = [];
public function initialize()
{
if (isset($this->request->adminInfo) && $this->request->adminInfo) {
$this->adminInfo = $this->request->adminInfo;
$this->adminId = $this->request->adminInfo['admin_id']; // ✅ 正确的键名
}
}
}
```
## 解决方案
### 方案:Controller传递参数到Logic
**原则**
- Controller层负责获取管理员信息
- 通过参数传递给Logic层
- Logic层不直接访问request对象
## 修改内容
### 1. DiagnosisController.php
#### getCallSignature 方法
```php
// 修改前
public function getCallSignature()
{
$params = $this->request->post();
// ... 验证参数
$result = DiagnosisLogic::getCallSignature($params);
// ...
}
// 修改后
public function getCallSignature()
{
$params = $this->request->post();
// ... 验证参数
// ✅ 传递当前管理员ID
$params['admin_id'] = $this->adminId;
$result = DiagnosisLogic::getCallSignature($params);
// ...
}
```
#### startCall 方法
```php
// 修改后
public function startCall()
{
$params = $this->request->post();
if (empty($params['diagnosis_id'])) {
return $this->fail('诊单ID不能为空');
}
// ✅ 传递当前管理员ID
$params['admin_id'] = $this->adminId;
$result = DiagnosisLogic::startCall($params);
// ...
}
```
#### endCall 方法
```php
// 修改后
public function endCall()
{
$params = $this->request->post();
if (empty($params['diagnosis_id'])) {
return $this->fail('诊单ID不能为空');
}
// ✅ 传递当前管理员ID
$params['admin_id'] = $this->adminId;
$result = DiagnosisLogic::endCall($params);
// ...
}
```
### 2. DiagnosisLogic.php
#### getCallSignature 方法
```php
// 修改前
public static function getCallSignature(array $params)
{
// ❌ 错误的获取方式
$adminId = request()->adminInfo['user_id'] ?? 0;
$userId = 'doctor_' . $adminId;
// ...
}
// 修改后
public static function getCallSignature(array $params)
{
// ✅ 从参数中获取
$adminId = $params['admin_id'] ?? 0;
if (!$adminId) {
self::setError('获取管理员信息失败');
return false;
}
$userId = 'doctor_' . $adminId;
// ...
}
```
#### startCall 方法
```php
// 修改前
public static function startCall(array $params): bool
{
// ❌ 错误的获取方式
$adminId = request()->adminInfo['user_id'] ?? 0;
// ...
}
// 修改后
public static function startCall(array $params): bool
{
// ✅ 从参数中获取
$adminId = $params['admin_id'] ?? 0;
if (!$adminId) {
self::setError('获取管理员信息失败');
return false;
}
// ...
}
```
#### endCall 方法
```php
// 修改前
public static function endCall(array $params): bool
{
// ❌ 错误的获取方式
$adminId = request()->adminInfo['user_id'] ?? 0;
// ...
}
// 修改后
public static function endCall(array $params): bool
{
// ✅ 从参数中获取
$adminId = $params['admin_id'] ?? 0;
if (!$adminId) {
self::setError('获取管理员信息失败');
return false;
}
// ...
}
```
## 影响范围
### 修改的文件
1. `server/app/adminapi/controller/tcm/DiagnosisController.php`
2. `server/app/adminapi/logic/tcm/DiagnosisLogic.php`
### 修改的方法
1. `getCallSignature()` - 获取通话签名
2. `startCall()` - 发起通话
3. `endCall()` - 结束通话
### 不影响的功能
- 患者账号创建(使用的是诊单中的patient_id)
- 管理员账号创建(使用的是Admin模型的ID)
- 其他诊单相关功能
## 测试方法
### 1. 测试获取通话签名
```bash
# 登录管理后台
# 进入诊单详情页
# 点击"视频通话"按钮
# 查看日志
tail -f server/runtime/adminapi/log/当前日期.log
```
**预期日志**
```
[info] 开始导入医生IM账号 - admin_id: 1, user_id: doctor_1, name: 管理员
[info] 医生IM账号导入成功 - admin_id: 1, user_id: doctor_1
```
**不应该出现**
```
[error] 获取管理员信息失败
[info] admin_id: 0 // ❌ ID为0说明获取失败
```
### 2. 测试发起通话
```bash
# 点击"发起通话"按钮
# 查看数据库
SELECT * FROM zyt_tcm_call_record ORDER BY id DESC LIMIT 1;
```
**预期结果**
- `caller_id` 应该是当前管理员的ID(如:1
- 不应该是 0
### 3. 测试结束通话
```bash
# 点击"结束通话"按钮
# 查看数据库
SELECT * FROM zyt_tcm_call_record WHERE status = 2 ORDER BY id DESC LIMIT 1;
```
**预期结果**
- 通话记录的 `status` 应该变为 2
- `end_time``duration` 应该有值
## 验证清单
- [ ] 点击"视频通话"按钮,能正常获取签名
- [ ] 日志显示正确的 admin_id(不是0)
- [ ] 医生IM账号导入成功
- [ ] 发起通话时,call_record 表的 caller_id 正确
- [ ] 结束通话时,通话记录正确更新
## 相关文档
- [DOCTOR_IM_ACCOUNT.md](./DOCTOR_IM_ACCOUNT.md) - 医生账号导入功能
- [IM_ACCOUNT_IMPORT.md](./IM_ACCOUNT_IMPORT.md) - IM账号导入完整文档
## 技术要点
### 1. ThinkPHP 架构最佳实践
```php
// ✅ 推荐:Controller传递参数
class Controller {
public function action() {
$params['admin_id'] = $this->adminId;
Logic::method($params);
}
}
class Logic {
public static function method($params) {
$adminId = $params['admin_id'];
}
}
// ❌ 不推荐:Logic直接访问request
class Logic {
public static function method($params) {
$adminId = request()->adminInfo['admin_id']; // 耦合度高
}
}
```
### 2. 参数验证
```php
// ✅ 添加参数验证
$adminId = $params['admin_id'] ?? 0;
if (!$adminId) {
self::setError('获取管理员信息失败');
return false;
}
```
### 3. 错误处理
```php
// ✅ 提供明确的错误信息
if (!$adminId) {
self::setError('获取管理员信息失败');
return false;
}
// ❌ 不要静默失败
$adminId = $params['admin_id'] ?? 0; // 如果为0,后续逻辑会出错
```
## 更新日志
### 2026-03-02
- ✅ 修复 `getCallSignature()` 方法获取管理员ID失败的问题
- ✅ 修复 `startCall()` 方法获取管理员ID失败的问题
- ✅ 修复 `endCall()` 方法获取管理员ID失败的问题
- ✅ 改进架构:Controller传递参数到Logic
- ✅ 添加参数验证和错误处理
---
**现在管理员ID可以正确获取,医生IM账号导入功能应该能正常工作了!**