CaiWuXiTong/app/Utilities/SidebarPermissions.php
WuYongJie e9ef4a9eef feat: 新增送货未定价/退货未定价/其他扣款补款/代发快递 4个子页面 + 嵌套子菜单
新增4个子功能页面:
- 送货未定价 (delivery-unpriced): pm_unOrderDetails, 265452行
- 退货未定价 (return-unpriced): finance_purchaseReturn WHERE priceB=0, 35928行
- 其他扣款补款 (other-adjustments): fys_supplierPaymentSummary WHERE other!=0, 460行
- 代发快递 (dropshipping-express): fys_express_courier_settlement, 765行

嵌套子菜单改造:
- 未定价明细下新增children嵌套结构(送货未定价+退货未定价)
- ShowInAdmin监听器支持page级dropdown嵌套
- Business\Pages控制器支持父级page跳转到第一个子页面
- SidebarPermissions支持children权限key
2026-07-21 19:17:06 +08:00

116 lines
3.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Utilities;
use App\Models\Auth\User;
class SidebarPermissions
{
public static function settings(): array
{
$value = setting('system.sidebar_permissions', []);
if (is_string($value)) {
$value = json_decode($value, true) ?: [];
}
return is_array($value) ? $value : [];
}
public static function subjectKey(User $user): string
{
$userKey = 'user_' . $user->id;
$settings = self::settings();
if (in_array($userKey, $settings['configured'] ?? [], true)) {
return $userKey;
}
return 'role_' . SystemAccess::roleName($user);
}
public static function allowedKeys(User $user): ?array
{
$settings = self::settings();
$subject = self::subjectKey($user);
if (! in_array($subject, $settings['configured'] ?? [], true)) {
return null;
}
return array_values(array_unique((array) ($settings['subjects'][$subject] ?? [])));
}
public static function navigationFor(User $user): array
{
$navigation = BusinessNavigation::all();
$allowed = self::allowedKeys($user);
if ($allowed === null) {
return $navigation;
}
return array_values(array_filter(array_map(function (array $section) use ($allowed) {
$sectionKey = $section['slug'];
if (in_array($sectionKey, $allowed, true)) {
return $section;
}
$pages = array_values(array_filter($section['pages'] ?? [], function (array $page) use ($allowed, $sectionKey) {
$pageKey = $sectionKey . '/' . $page['slug'];
if (in_array($pageKey, $allowed, true)) {
// 若有 children,保留 children 的精确权限过滤
if (! empty($page['children'])) {
$page['children'] = array_values(array_filter($page['children'], function (array $child) use ($sectionKey) {
return in_array($sectionKey . '/' . $child['slug'], $allowed, true);
}));
}
return true;
}
// 子页面可能在 allowed 列表中(独立 URL),父级分组也允许展开
if (! empty($page['children'])) {
$visibleChildren = array_values(array_filter($page['children'], function (array $child) use ($sectionKey) {
return in_array($sectionKey . '/' . $child['slug'], $allowed, true);
}));
if (! empty($visibleChildren)) {
$page['children'] = $visibleChildren;
return true;
}
}
return false;
}));
if (! empty($pages)) {
$section['pages'] = $pages;
return $section;
}
return null;
}, $navigation)));
}
public static function allKeys(): array
{
$keys = [];
foreach (BusinessNavigation::all() as $section) {
$keys[] = $section['slug'];
foreach ($section['pages'] ?? [] as $page) {
$keys[] = $section['slug'] . '/' . $page['slug'];
foreach ($page['children'] ?? [] as $child) {
$keys[] = $section['slug'] . '/' . $child['slug'];
}
}
}
return $keys;
}
}