diff --git a/saiadmin-artd/src/views/system/role/index.vue b/saiadmin-artd/src/views/system/role/index.vue index 7535d68..b96b295 100644 --- a/saiadmin-artd/src/views/system/role/index.vue +++ b/saiadmin-artd/src/views/system/role/index.vue @@ -125,6 +125,10 @@ } = useTable({ core: { apiFn: api.list, + apiParams: { + orderField: 'level', + orderType: 'desc' + }, columnsFactory: () => [ { prop: 'id', label: 'table.columns.common.no', minWidth: 60, align: 'center' }, { prop: 'name', label: 'page.table.roleName', minWidth: 120 }, diff --git a/server/plugin/saiadmin/app/logic/system/SystemRoleLogic.php b/server/plugin/saiadmin/app/logic/system/SystemRoleLogic.php index 5598cc7..92e97b4 100644 --- a/server/plugin/saiadmin/app/logic/system/SystemRoleLogic.php +++ b/server/plugin/saiadmin/app/logic/system/SystemRoleLogic.php @@ -20,6 +20,10 @@ use support\think\Db; */ class SystemRoleLogic extends BaseLogic { + protected string $orderField = 'level'; + + protected string $orderType = 'desc'; + public function __construct() { $this->model = new SystemRole(); @@ -110,7 +114,6 @@ class SystemRoleLogic extends BaseLogic $query->where('level', '<', $maxLevel); } $query->where('id', '<>', SystemRoleChannelService::SUPER_ADMIN_ROLE_ID); - $query->order('sort', 'desc'); return $this->getAll($query); } diff --git a/server/plugin/saiadmin/app/service/SystemRoleChannelService.php b/server/plugin/saiadmin/app/service/SystemRoleChannelService.php index a994954..6a008e6 100644 --- a/server/plugin/saiadmin/app/service/SystemRoleChannelService.php +++ b/server/plugin/saiadmin/app/service/SystemRoleChannelService.php @@ -189,12 +189,16 @@ class SystemRoleChannelService if ($this->tableHasColumn('sa_system_role', 'dept_id')) { $query->where('dept_id', 0); } - $rows = $query->order('sort', 'desc')->select()->toArray(); - if (count($rows) === count($codes)) { - return $rows; + $rows = $query->select()->toArray(); + if (empty($rows)) { + return []; } - // 按配置顺序返回,缺失的 code 跳过 + if (count($rows) === count($codes)) { + return $this->sortRolesByLevelDesc($rows); + } + + // 按配置 code 补齐,缺失的 code 跳过,最终按角色级别从大到小排序 $byCode = []; foreach ($rows as $row) { $byCode[(string) ($row['code'] ?? '')] = $row; @@ -205,7 +209,25 @@ class SystemRoleChannelService $ordered[] = $byCode[$code]; } } - return $ordered; + return $this->sortRolesByLevelDesc($ordered); + } + + /** + * 按角色级别从大到小排序(同级别按 sort 降序) + * + * @param array> $rows + * @return array> + */ + private function sortRolesByLevelDesc(array $rows): array + { + usort($rows, static function (array $a, array $b): int { + $levelCompare = (int) ($b['level'] ?? 0) <=> (int) ($a['level'] ?? 0); + if ($levelCompare !== 0) { + return $levelCompare; + } + return (int) ($b['sort'] ?? 0) <=> (int) ($a['sort'] ?? 0); + }); + return $rows; } private function insertRoleFromTemplate(array $template, int $deptId): int