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