logService = $logService; } /** * 创建角色 * @param array $data * @return Model|Builder * @throws Exception */ public function createModel(array $data): Model|Builder { try { DB::beginTransaction(); $region_data = $data['region_data'] ?? []; if (AdminFloor::query()->where('name', $data['name'])->exists()) { throw new Exception(__('service.admin_floor.name_exists')); } $model = AdminFloor::query()->create([ 'name' => $data['name'], 'image_url' => $data['image_url'], 'created_at' => get_datetime() ]); $this->logService->logCreated($model, '创建楼层'); if ($region_data) { $this->addAdminFloorRegion($model->id, $region_data); } DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } /** * 同步添加区域关联数据 * @param int $floor_id * @param array $regionData * @return void */ private function addAdminFloorRegion(int $floor_id, array $regionData): void { $regionSaveData = []; foreach ($regionData as $value) { $regionSaveData[] = [ 'floor_id' => $floor_id, 'name' => $value['name'], 'created_at' => get_datetime() ]; } AdminFloorRegion::query()->insert($regionSaveData); $AdminRoleMenuData = AdminFloorRegion::getFloorRegion($floor_id); $this->logService->logCreatedData( new AdminFloorRegion(), '创建楼层关联区域', $AdminRoleMenuData ); } /** * @param array $data * @param int $id * @return Model|Builder * @throws Exception */ public function updateModel(array $data, int $id): Model|Builder { try { DB::beginTransaction(); $region_data = $data['region_data'] ?? []; // 验证 $existsWhere = [ ['name', '=', $data['name']], ['id', '<>', $id] ]; if (AdminFloor::query()->where($existsWhere)->exists()) { throw new Exception(__('service.admin_role.name_exists')); } // 更新 $model = AdminFloor::query()->findOrFail($id); $oldValues = $model->toArray(); $model->update([ 'name' => $data['name'], 'image_url' => $data['image_url'], 'updated_at' => get_datetime() ]); $this->logService->logUpdated($model, $oldValues, '更新楼层'); // 删除再创建关联 $nameArr = array_column($region_data, 'name'); if (AdminFloorRegion::existsRoleMenu($id, $nameArr)) { $this->delAdminFloorRegion($id); if ($region_data) { $this->addAdminFloorRegion($id, $region_data); } } DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } protected function delAdminFloorRegion($floor_id): void { $oldData = AdminFloorRegion::query()->where('floor_id', $floor_id) ->select()->get()->toArray(); $this->logService->logDeletedData( new AdminFloorRegion(), '删除角色关联菜单', $oldData ); AdminFloorRegion::query()->where('floor_id', $floor_id)->delete(); } /** * @param $id * @return bool * @throws Exception */ public function deleteModel($id): bool { try { DB::beginTransaction(); $model = AdminFloor::query()->findOrFail($id); $this->logService->logDeleted($model, '删除楼层'); $model->delete(); $this->delAdminFloorRegion($id); DB::commit(); return true; } catch (Exception $e) { DB::rollBack(); throw $e; } } }