This commit is contained in:
Your Name
2026-05-25 18:32:17 +08:00
parent 5430fe0417
commit 58c224a081
5 changed files with 376 additions and 3 deletions
@@ -115,6 +115,123 @@ class PrescriptionOrderLogic
return self::roleIntersect($adminInfo, is_array($roles) ? $roles : []);
}
/**
* 「下单」角色:列表「审核人」筛选仅允许查本人审核过的订单(经理/管理员等豁免)
*/
public static function isOrderPlacerAuditFilterRestricted(array $adminInfo): bool
{
if (!empty($adminInfo['root']) && (int) $adminInfo['root'] === 1) {
return false;
}
$placer = Config::get('project.prescription_order_placer_role_ids', [6]);
if (!self::roleIntersect($adminInfo, is_array($placer) ? $placer : [])) {
return false;
}
$exempt = Config::get('project.prescription_order_placer_exempt_role_ids', [3, 8]);
return !self::roleIntersect($adminInfo, is_array($exempt) ? $exempt : []);
}
/** @return string[] */
public static function prescriptionOrderAuditLogActions(): array
{
return ['audit_rx_approve', 'audit_rx_reject', 'audit_pay_approve', 'audit_pay_reject'];
}
/** 是否展示「下单人」筛选(下单 / 经理 / 管理员 / 超管) */
public static function shouldShowAuditAdminFilter(array $adminInfo): bool
{
if (!empty($adminInfo['root']) && (int) $adminInfo['root'] === 1) {
return true;
}
if (self::isOrderPlacerAuditFilterRestricted($adminInfo)) {
return true;
}
$exempt = Config::get('project.prescription_order_placer_exempt_role_ids', [3, 8]);
return self::roleIntersect($adminInfo, is_array($exempt) ? $exempt : []);
}
/**
* 下单人下拉:直接取「下单」角色下的后台用户(project.prescription_order_placer_role_ids
*
* @return array<int, array{id: int, name: string}>
*/
public static function listAuditAdminOptions(int $adminId, array $adminInfo): array
{
if ($adminId <= 0 || !self::shouldShowAuditAdminFilter($adminInfo)) {
return [];
}
$roleIds = Config::get('project.prescription_order_placer_role_ids', [6]);
$roleIds = array_values(array_unique(array_filter(array_map(
'intval',
is_array($roleIds) ? $roleIds : []
), static fn(int $id): bool => $id > 0)));
if ($roleIds === []) {
$roleIds = [6];
}
if (self::isOrderPlacerAuditFilterRestricted($adminInfo)) {
$name = trim((string) ($adminInfo['name'] ?? ''));
return [
[
'id' => $adminId,
'name' => $name !== '' ? $name : ('管理员#' . $adminId),
],
];
}
$rows = Db::name('admin')
->alias('a')
->join('admin_role ar', 'a.id = ar.admin_id')
->whereIn('ar.role_id', $roleIds)
->where('a.disable', 0)
->whereNull('a.delete_time')
->field(['a.id', 'a.name'])
->distinct(true)
->order('a.name', 'asc')
->select()
->toArray();
$out = [];
foreach ($rows as $r) {
$id = (int) ($r['id'] ?? 0);
if ($id <= 0) {
continue;
}
$name = trim((string) ($r['name'] ?? ''));
if ($name === '') {
$name = '管理员#' . $id;
}
$out[] = ['id' => $id, 'name' => $name];
}
return $out;
}
/** 指定后台账号是否拥有「下单」角色 */
public static function adminHasPlacerRole(int $adminId): bool
{
if ($adminId <= 0) {
return false;
}
$roleIds = Config::get('project.prescription_order_placer_role_ids', [6]);
$roleIds = array_values(array_unique(array_filter(array_map(
'intval',
is_array($roleIds) ? $roleIds : []
), static fn(int $id): bool => $id > 0)));
if ($roleIds === []) {
$roleIds = [6];
}
return Db::name('admin_role')
->where('admin_id', $adminId)
->whereIn('role_id', $roleIds)
->count() > 0;
}
/**
* 菜单权限:非全量角色可额外查看「关联处方开方人为本账号」的业务订单(医助代建单)
*