From 308eb04b0a4ade3449563462acce24ba83689af8 Mon Sep 17 00:00:00 2001 From: wanghongjun <1445693971@qq.com> Date: Fri, 12 Jun 2026 15:43:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BD=A6=E4=BD=8D=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E3=80=81=E4=B8=8B=E8=BD=BD=E8=BD=A6=E4=BD=8D=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Exports/ParkingSpaceTemplateExport.php | 31 ++++++ .../Admin/ParkingSpaceController.php | 67 +++++++++++++ app/Imports/ParkingSpaceImport.php | 97 +++++++++++++++++++ database/seeders/AdminMenuSeeder.php | 4 +- resources/lang/en/exports.php | 2 + resources/lang/zh-CN/exports.php | 2 + resources/lang/zh-TW/exports.php | 2 + routes/admin/api.php | 2 + 8 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 app/Exports/ParkingSpaceTemplateExport.php create mode 100644 app/Imports/ParkingSpaceImport.php diff --git a/app/Exports/ParkingSpaceTemplateExport.php b/app/Exports/ParkingSpaceTemplateExport.php new file mode 100644 index 0000000..b3220bf --- /dev/null +++ b/app/Exports/ParkingSpaceTemplateExport.php @@ -0,0 +1,31 @@ +all(); + $validator = Validator::make($data, [ + 'file' => 'required|mimes:xlsx,xls,csv,txt|max:2048' + ], [ + 'file.required' => __('validation.admin_list_vip.file_empty'), + 'file.mimes' => __('validation.admin_list_vip.file_mimes'), + 'file.max' => __('validation.admin_list_vip.file_max') + ]); + if ($validator->fails()) { + throw new ValidationException($validator); + } + + // 2. 获取上传的文件 + $file = $request->file('file'); + + // 3. 正确的做法:先存储文件,再获取绝对路径进行导入 + $path = $file->store('imports'); + + // 4. 执行导入(使用存储后的绝对路径) + // storage_path('app') 获取 storage/app 的绝对路径 + Excel::import( + new ParkingSpaceImport($this->adminUserId), + storage_path('app/' . $path) + ); + + // 5. (可选)导入完成后删除临时文件 + Storage::delete($path); + + return $this->responseService->success( + __('controller.import.success') + ); + } catch (ValidationException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.admin_vip_list.import_failed') . ':' + . $e->getMessage() + ); + } + } } diff --git a/app/Imports/ParkingSpaceImport.php b/app/Imports/ParkingSpaceImport.php new file mode 100644 index 0000000..13008dc --- /dev/null +++ b/app/Imports/ParkingSpaceImport.php @@ -0,0 +1,97 @@ +user_id = $admin_user_id; + } + + public function model(array $row) + { + if ($this->index == 1) { + $this->index += 1; + return; + } + $parking = $row[1]; + $floor = $row[2]; + $region = $row[3]; + $attr = $row[4]; + $number = $row[5]; + if (empty($parking)) { + return; + } + if (empty($floor)) { + return; + } + if (empty($region)) { + return; + } + if (empty($attr)) { + return; + } + if (empty($number)) { + return; + } + $parking_id = Parking::getValueId($parking); + if (!$parking_id) { + return; + } + $floor_id = AdminFloor::query()->where('status', 1)->where( + 'building_floor', + $parking_id + )->value('id'); + if (!$floor_id) { + return; + } + $region_id = AdminFloorRegion::query()->where('status', 1)->where( + 'floor_id', + $floor_id + )->value('id'); + $attr_id = ParkingSpaceAttributes::query()->where('attributes', $attr) + ->value('id'); + if (!$attr_id) { + return; + } + + $create = $where = [ + 'number' => $number, + 'floor_id' => $floor_id, + 'region_id' => $region_id + ]; + if (ParkingSpace::query()->where($where)->exists()) { + return; + } + $create['space_type_id'] = 0; + $res = ParkingSpaceType::getDefaultData(); + if ($res) { + $create['space_type_id'] = $res['id']; + } + $create['space_attr_id'] = $attr_id; + + $service = new ParkingSpaceService(new OperationLogService()); + $service->createData($create); + } + + + public function chunkSize(): int + { + return 1000; // 设置每次处理的行数,有助于避免内存问题并可能改善表头解析 + } +} diff --git a/database/seeders/AdminMenuSeeder.php b/database/seeders/AdminMenuSeeder.php index c6aae81..f19b336 100644 --- a/database/seeders/AdminMenuSeeder.php +++ b/database/seeders/AdminMenuSeeder.php @@ -512,7 +512,9 @@ class AdminMenuSeeder extends Seeder 'edit' => 'parkingSpaceManagement.update', 'delete' => 'parkingSpaceManagement.destroy', 'batch_update_attr' => 'parkingSpaceManagement.batchUpdateAttr', - 'batch_delete' => 'parkingSpaceManagement.batchDelete' + 'batch_delete' => 'parkingSpaceManagement.batchDelete', + 'batch_import' => 'parkingSpaceManagement.batchImport', + 'download_template' => 'parkingSpaceManagement.downloadTemplate' ] ], ], diff --git a/resources/lang/en/exports.php b/resources/lang/en/exports.php index 2d929d1..4119939 100644 --- a/resources/lang/en/exports.php +++ b/resources/lang/en/exports.php @@ -25,6 +25,8 @@ return [ 'space_type' => 'Parking space type', 'operation_type' => 'Operation Type', 'updated_at' => 'Last update time', + 'region' => 'region', + 'list_export' => 'Import parking spaces', ], 'parking_camera' => [ 'list' => 'Parking camera', diff --git a/resources/lang/zh-CN/exports.php b/resources/lang/zh-CN/exports.php index 00d8d84..f0f8fe9 100644 --- a/resources/lang/zh-CN/exports.php +++ b/resources/lang/zh-CN/exports.php @@ -25,6 +25,8 @@ return [ 'space_type' => '车位类型', 'operation_type' => '操作类型', 'updated_at' => '最后更新时间', + 'region' => '区域', + 'list_export' => '导入车位', ], 'parking_camera' => [ 'list' => '车位相机', diff --git a/resources/lang/zh-TW/exports.php b/resources/lang/zh-TW/exports.php index d13cb18..f70207c 100644 --- a/resources/lang/zh-TW/exports.php +++ b/resources/lang/zh-TW/exports.php @@ -25,6 +25,8 @@ return [ 'space_type' => '車位類型', 'operation_type' => '操作類型', 'updated_at' => '最後更新時間', + 'region' => '區域', + 'list_export' => '導入車位', ], 'parking_camera' => [ 'list' => '車位相機', diff --git a/routes/admin/api.php b/routes/admin/api.php index f67eb9f..49111bb 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -128,6 +128,7 @@ Route::group(['prefix' => 'admin'], function () { Route::delete('/parkingSpaceManagement/{id}', [ParkingSpaceController::class, 'destroy']); Route::post('/parkingSpaceManagement/batchDelete', [ParkingSpaceController::class, 'batchDelete']); Route::post('/parkingSpaceManagement/batchUpdateAttr', [ParkingSpaceController::class, 'updateAttr']); + Route::post('/parkingSpaceManagement/batchImport', [ParkingSpaceController::class, 'import']); //车位类型管理 Route::get('/spaceType', [ParkingSpaceTypeController::class, 'index']); Route::get('/spaceType/create', [ParkingSpaceTypeController::class, 'create']); @@ -375,4 +376,5 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/whitelist/downloadTemplate', [ParkingWhitelistController::class, 'downloadTemplate']); Route::get('/whitelist/export', [ParkingWhitelistController::class, 'export']); Route::get('/parkingRepair/downloadTemplate', [ParkingSpaceRepairController::class, 'downloadTemplate']); + Route::get('/parkingSpaceManagement/downloadTemplate', [ParkingSpaceController::class, 'importTemplate']); });