Files
zyt/PRESCRIPTION_VIEW_PERMISSION_FIX.md
T
2026-04-10 14:43:58 +08:00

130 lines
4.0 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=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`