4.0 KiB
4.0 KiB
业务订单中处方查看权限修复
问题描述
药师角色(角色ID=6)在查看业务订单详情时,提示"无权限查看此处方"。
虽然药师有业务订单管理权限(order_edit_all_roles 包含角色6),但在业务订单详情中需要显示关联的处方信息时,PrescriptionLogic::canViewPrescription() 方法会拒绝访问。
问题原因
canViewPrescription 方法的权限检查层级为:
- 超级管理员
- 处方创建人
- 医助
- 共享处方
- 可见角色
- 有开方权限的医生(
tcm.diagnosis/kaifang)
药师角色通常没有 tcm.diagnosis/kaifang 权限,因此无法通过权限检查。
解决方案
在 canViewPrescription 方法中添加新的权限检查层级:
有业务订单管理权限的角色(如药师)可以查看处方(只读)
这样药师可以在业务订单中查看关联的处方信息,以便进行订单审核和管理。
代码修改
文件:server/app/adminapi/logic/tcm/PrescriptionLogic.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;
}
权限层级(更新后)
- 超级管理员(root=1)
- 处方创建人
- 医助
- 共享处方(is_shared=1)
- 可见角色(visible_role_ids)
- 有开方权限的医生(
tcm.diagnosis/kaifang) - 有业务订单管理权限的角色(
order_edit_all_roles) ← 新增
配置文件
文件:server/config/project.php
// 医助创建订单权限:拥有以下角色ID的用户可修改任意订单,其他用户只能修改自己创建的订单
'order_edit_all_roles' => [0, 3, 6],
- 角色 0:超级管理员
- 角色 3:管理员
- 角色 6:药师
使用场景
药师角色现在可以:
- 查看业务订单列表
- 打开业务订单详情
- 查看订单中关联的处方信息(只读)
- 进行处方审核
- 进行支付单审核
- 编辑业务订单信息
测试验证
- 使用药师账号登录
- 进入"消费者处方订单"列表
- 点击任意订单的"详情"按钮
- 确认可以正常查看处方信息,不再提示"无权限查看此处方"
注意事项
- 此权限为只读权限,药师不能编辑处方内容
- 药师只能通过业务订单查看处方,不能直接在处方列表中查看其他医生的处方
- 修改代码后需要清除缓存:
php think clear