'MSCP', 2 => 'GSCP']; /** * @var OperationLogService */ private OperationLogService $logService; /** * 构造函数 * @param OperationLogService $logService */ public function __construct(OperationLogService $logService) { $this->logService = $logService; $this->logService->menuTitle = 'floor_plan'; } /** * 创建角色 * @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, 'admin_floor.create'); 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(), 'admin_floor.region_create', $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, 'admin_floor.update'); // 删除再创建关联 $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(), 'admin_floor.region_delete', $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, 'admin_floor.delete'); $model->delete(); $this->delAdminFloorRegion($id); DB::commit(); return true; } catch (Exception $e) { DB::rollBack(); throw $e; } } // 获取楼层列表 public static function getSelectList($building_floor, $column = []): array { if (empty($column)) { $column = [ 'id as floor_id', 'name as floor_name', 'image_url as pic_url', 'building_floor' ]; } $list = AdminFloor::query()->where('building_floor', $building_floor)->whereNull('deleted_at')->select($column) ->get()->toArray(); foreach ($list as &$item) { if (isset($item['pic_url'])) { $item['pic_url'] = env('APP_URL') . $item['pic_url']; } } return $list; } // 获取单个楼层信息 public static function getFloorData($id): array { $data = AdminFloor::query()->where('id', $id)->get()->toArray(); foreach ($data as &$item) { if (isset($item['image_url'])) { $item['pic_url'] = env('APP_URL') . $item['image_url']; } } return $data; } // 获取楼栋层 public static function getBuildingFloor(): array { return self::$buildingFloor; } }