130 lines
4.0 KiB
Markdown
130 lines
4.0 KiB
Markdown
# 业务订单中处方查看权限修复
|
||
|
||
## 问题描述
|
||
|
||
药师角色(角色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`
|