This commit is contained in:
Your Name
2026-04-10 14:43:58 +08:00
parent fdf714f833
commit 4909ec6daa
38 changed files with 6549 additions and 735 deletions
+129
View File
@@ -0,0 +1,129 @@
# 业务订单中处方查看权限修复
## 问题描述
药师角色(角色ID=6)在查看业务订单详情时,提示"无权限查看此处方"。
虽然药师有业务订单管理权限(`order_edit_all_roles` 包含角色6),但在业务订单详情中需要显示关联的处方信息时,`PrescriptionLogic::canViewPrescription()` 方法会拒绝访问。
## 问题原因
`canViewPrescription` 方法的权限检查层级为:
1. 超级管理员
2. 处方创建人
3. 医助
4. 共享处方
5. 可见角色
6. 有开方权限的医生(`tcm.diagnosis/kaifang`
药师角色通常没有 `tcm.diagnosis/kaifang` 权限,因此无法通过权限检查。
## 解决方案
`canViewPrescription` 方法中添加新的权限检查层级:
**有业务订单管理权限的角色(如药师)可以查看处方(只读)**
这样药师可以在业务订单中查看关联的处方信息,以便进行订单审核和管理。
## 代码修改
文件:`server/app/adminapi/logic/tcm/PrescriptionLogic.php`
```php
public static function canViewPrescription($row, int $adminId, array $adminInfo): bool
{
// 超级管理员
if (!empty($adminInfo['root']) && (int) $adminInfo['root'] === 1) {
return true;
}
// 创建人
$creatorId = is_array($row) ? (int) ($row['creator_id'] ?? 0) : (int) $row->creator_id;
if ($creatorId === $adminId) {
return true;
}
// 医助
$assistantId = is_array($row) ? (int) ($row['assistant_id'] ?? 0) : (int) ($row->assistant_id ?? 0);
if ($assistantId > 0 && $assistantId === $adminId) {
return true;
}
// 共享处方
$isShared = is_array($row) ? (int) ($row['is_shared'] ?? 0) : (int) $row->is_shared;
if ($isShared === 1) {
return true;
}
// 可见角色
$vis = is_array($row) ? (string) ($row['visible_role_ids'] ?? '') : (string) ($row->visible_role_ids ?? '');
$allowed = array_filter(array_map('intval', explode(',', $vis)));
$myRoles = array_map('intval', $adminInfo['role_id'] ?? []);
if (count(array_intersect($myRoles, $allowed)) > 0) {
return true;
}
// 有开方权限的医生可以查看所有处方(只读)
$permissions = $adminInfo['permissions'] ?? [];
if (in_array('tcm.diagnosis/kaifang', $permissions, true)) {
return true;
}
// 【新增】有业务订单管理权限的角色(如药师)可以查看处方(只读)
$orderEditAllRoles = Config::get('project.order_edit_all_roles', [0, 3]);
$myRoles = array_map('intval', $adminInfo['role_id'] ?? []);
$allowedRoles = array_map('intval', is_array($orderEditAllRoles) ? $orderEditAllRoles : []);
if (count(array_intersect($myRoles, $allowedRoles)) > 0) {
return true;
}
return false;
}
```
## 权限层级(更新后)
1. 超级管理员(root=1
2. 处方创建人
3. 医助
4. 共享处方(is_shared=1
5. 可见角色(visible_role_ids
6. 有开方权限的医生(`tcm.diagnosis/kaifang`
7. **有业务订单管理权限的角色(`order_edit_all_roles`** ← 新增
## 配置文件
文件:`server/config/project.php`
```php
// 医助创建订单权限:拥有以下角色ID的用户可修改任意订单,其他用户只能修改自己创建的订单
'order_edit_all_roles' => [0, 3, 6],
```
- 角色 0:超级管理员
- 角色 3:管理员
- 角色 6:药师
## 使用场景
药师角色现在可以:
1. 查看业务订单列表
2. 打开业务订单详情
3. 查看订单中关联的处方信息(只读)
4. 进行处方审核
5. 进行支付单审核
6. 编辑业务订单信息
## 测试验证
1. 使用药师账号登录
2. 进入"消费者处方订单"列表
3. 点击任意订单的"详情"按钮
4. 确认可以正常查看处方信息,不再提示"无权限查看此处方"
## 注意事项
1. 此权限为只读权限,药师不能编辑处方内容
2. 药师只能通过业务订单查看处方,不能直接在处方列表中查看其他医生的处方
3. 修改代码后需要清除缓存:`php think clear`