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

4.0 KiB
Raw Blame History

业务订单中处方查看权限修复

问题描述

药师角色(角色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

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

// 医助创建订单权限:拥有以下角色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