logService = $logService; } /** * @param array $data * @param int $id * @return Model|Builder * @throws Exception */ public function updateModel(array $data, int $id): Model|Builder { try { DB::beginTransaction(); $remark = $data['remark'] ?? ''; $menu_ids = $data['menu_ids']; // 验证 $existsWhere = [ ['name', '=', $data['name']], ['id', '<>', $id] ]; if (AdminRoles::query()->where($existsWhere)->exists()) { throw new Exception(__('service.admin_role.name_exists')); } self::validateMenuIds($menu_ids); // 更新 $model = AdminRoles::query()->findOrFail($id); $oldValues = $model->toArray(); $model->update([ 'name' => $data['name'], 'remark' => $remark, 'level' => $data['level'], 'updated_at' => get_datetime() ]); $this->logService->logUpdated($model, $oldValues, '更新角色'); // 删除再创建关联 if (AdminRoleMenu::existsRoleMenu($id, $menu_ids)) { $this->delAdminRoleMenu($id); $this->addAdminRoleMenu($id, $menu_ids); } DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } /** * 验证菜单数据 * @param array $menu_ids * @return void * @throws Exception */ public static function validateMenuIds(array $menu_ids): void { foreach ($menu_ids as $menu_id) { if (!is_numeric($menu_id)) { throw new Exception(__('service.admin_role.menu_error')); } } } /** * 同步删除角色菜单关联数据 * @param int $role_id * @return void */ private function delAdminRoleMenu(int $role_id): void { $oldAdminRoleMenu = AdminRoleMenu::query()->where('role_id', $role_id) ->select()->get()->toArray(); $this->logService->logDeletedData( new AdminRoleMenu(), '删除角色关联菜单', $oldAdminRoleMenu ); AdminRoleMenu::query()->where('role_id', $role_id)->delete(); } /** * 同步添加角色菜单关联数据 * @param int $role_id * @param array $menu_ids * @return void */ private function addAdminRoleMenu(int $role_id, array $menu_ids): void { AdminRoleMenu::createModel($menu_ids, $role_id); $AdminRoleMenuData = AdminRoleMenu::getMenuData($role_id); $this->logService->logCreatedData( new AdminRoleMenu(), '创建角色关联菜单', $AdminRoleMenuData ); } /** * 创建角色 * @param array $data * @return Model|Builder * @throws Exception */ public function createModel(array $data): Model|Builder { try { DB::beginTransaction(); $remark = $data['remark'] ?? ''; $menu_ids = $data['menu_ids']; if (AdminRoles::query()->where('name', $data['name'])->exists()) { throw new Exception(__('service.admin_role.name_exists')); } self::validateMenuIds($menu_ids); $model = AdminRoles::query()->create([ 'name' => $data['name'], 'remark' => $remark, 'level' => $data['level'], 'created_at' => get_datetime() ]); $this->logService->logCreated($model, '创建角色'); $this->addAdminRoleMenu($model->id, $menu_ids); DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } /** * 删除角色 * @param int $id * @return bool * @throws Exception */ public function deleteModel(int $id): bool { try { DB::beginTransaction(); $model = AdminRoles::query()->findOrFail($id); $this->logService->logDeleted($model, '删除角色'); $model->delete(); $this->delAdminRoleMenu($id); DB::commit(); return true; } catch (Exception $e) { DB::rollBack(); throw $e; } } }