新增功能

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
+337
View File
@@ -0,0 +1,337 @@
# 修复管理员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账号导入功能应该能正常工作了!**