setName('admin:user:role:assign') ->addOption('user-id', null, Option::VALUE_REQUIRED, '用户ID') ->addOption('role-ids', null, Option::VALUE_REQUIRED, '角色ID列表(逗号分隔)') ->setDescription('给用户分配角色'); } protected function execute(Input $input, Output $output) { $userId = $input->getOption('user-id'); $roleIdsParam = $input->getOption('role-ids'); if (empty($userId)) { $output->error('用户ID不能为空'); return false; } if (empty($roleIdsParam)) { $output->error('角色ID不能为空'); return false; } try { $admin = SystemAdmin::find($userId); if (empty($admin)) { $output->error('用户ID ' . $userId . ' 不存在'); return false; } $roleIds = $this->parseRoleIds($roleIdsParam); if (empty($roleIds)) { $output->error('角色ID列表为空'); return false; } $validRoleIds = $this->validateRoleIds($roleIds); $invalidRoleIds = array_diff($roleIds, $validRoleIds); if (!empty($invalidRoleIds)) { $invalidCount = count($invalidRoleIds); $output->error("[错误] 发现 {$invalidCount} 个无效的角色ID:"); foreach (array_values($invalidRoleIds) as $roleId) { $output->error(" - {$roleId}"); } $output->writeln(''); } if (empty($validRoleIds)) { $output->error("有效角色ID数: 0"); $output->error("分配失败"); return false; } $existingAuthIds = $admin->auth_ids; $existingAuthIdArray = []; if (!empty($existingAuthIds)) { $existingAuthIdArray = array_filter(explode(',', $existingAuthIds)); } $newRoleIds = array_diff($validRoleIds, $existingAuthIdArray); if (empty($newRoleIds)) { $output->info('所有角色已存在,无需重复分配'); return true; } $mergedRoleIds = array_merge($existingAuthIdArray, $newRoleIds); $mergedRoleIds = array_values(array_unique($mergedRoleIds)); $admin->auth_ids = implode(',', $mergedRoleIds); $admin->save(); $output->info('角色分配成功'); $output->info('用户ID: ' . $userId); $output->info('新增的角色ID: ' . implode(', ', $newRoleIds)); $output->info('该用户总角色数: ' . count($mergedRoleIds)); $output->info('所有角色ID: ' . implode(', ', $mergedRoleIds)); } catch (\Throwable $e) { $output->error('分配角色失败: ' . $e->getMessage()); return false; } return true; } protected function parseRoleIds(string $roleIdsParam): array { $roleIds = explode(',', $roleIdsParam); $roleIds = array_map('trim', $roleIds); $roleIds = array_filter($roleIds); return array_values($roleIds); } protected function validateRoleIds(array $roleIds): array { $validRoleIds = SystemAuth::whereIn('id', $roleIds) ->where('delete_time', 0) ->column('id'); return $validRoleIds; } }