From 7b2ce402cc14eaba888639209f6cf25ec8036389 Mon Sep 17 00:00:00 2001 From: wanghongjun <1445693971@qq.com> Date: Fri, 29 May 2026 15:43:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=81=9C=E8=BD=A6=E5=9C=BA=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/ParkingManagementListController.php | 182 ++++++++++++++++++ .../Admin/ParkingSpaceController.php | 3 +- app/Models/AdminFloor.php | 25 ++- app/Models/AdminTranslation.php | 8 + app/Models/Parking.php | 31 +-- app/Models/ParkingSpace.php | 4 +- app/Models/ParkingSpaceAttributes.php | 30 ++- app/Models/ParkingSpaceType.php | 13 +- app/Services/AdminTranslationService.php | 7 + app/Services/ParkingSpaceService.php | 12 +- app/common.php | 33 ++++ ..._02_10_173627_create_admin_floor_table.php | 1 + ...3_23_143449_create_parking_space_table.php | 2 + resources/lang/en/service.php | 3 + resources/lang/zh-CN/service.php | 3 + resources/lang/zh-TW/service.php | 3 + routes/admin/api.php | 5 + 17 files changed, 339 insertions(+), 26 deletions(-) create mode 100644 app/Http/Controllers/Admin/ParkingManagementListController.php diff --git a/app/Http/Controllers/Admin/ParkingManagementListController.php b/app/Http/Controllers/Admin/ParkingManagementListController.php new file mode 100644 index 0000000..439e8cf --- /dev/null +++ b/app/Http/Controllers/Admin/ParkingManagementListController.php @@ -0,0 +1,182 @@ +responseService = $responseService; + $this->service = $service; + } + + /** + * @return JsonResponse + */ + public function search(): JsonResponse + { + try { + $data = [ + 'parking_list' => Parking::getData(), + 'floor_list' => AdminFloor::getData(), + 'space_attr_data' => ParkingSpaceAttributes::getData(), + 'status_data' => get_select_child_data( + $this->service->getStatusArr(true) + ) + ]; + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } + + public function index(Request $request): JsonResponse + { + try { + $query = ParkingSpace::query(); + if ($request->has('license_plate')) { + $license_plate = $request->input('license_plate'); + if (!empty($license_plate)) { + $license_plate_id_arr = ParkingLicensePlate::query()->where( + 'number', + 'like', + "%{$license_plate}%" + )->pluck('id'); + $license_plate_id_arr ? $query->whereIn( + 'license_plate_id', + $license_plate_id_arr + ) : $query->where('id', 0); + } + } + + if ($request->has('parking_id')) { + $parking_id = $request->input('parking_id'); + if (!empty($parking_id)) { + $floorIds = AdminFloor::query()->where( + 'building_floor', + $parking_id + )->pluck('id'); + if ($floorIds) { + $query->whereIn('floor_id', $floorIds); + } else { + $query->where('id', 0); + } + } + } + + if ($request->has('floor')) { + $floor = $request->input('floor'); + if (!empty($floor)) { + $query->where('floor_id', $floor); + } + } + + if ($request->has('number')) { + $number = $request->input('number'); + if (!empty($number)) { + $query->where('number', 'like', "%{$number}%"); + } + } + + if ($request->has('space_attr')) { + $space_attr = $request->input('space_attr'); + if (!empty($space_attr)) { + $query->where('space_attr_id', $space_attr); + } + } + + if ($request->has('status')) { + $status = $request->input('status'); + if (!empty($status)) { + $where = [['status', '=', 1]]; + if ($status == 3) { + $where[] = ['license_plate_id', '=', 0]; + $query->where($where); + } elseif ($status == 4) { + $where[] = ['license_plate_id', '>=', 1]; + $query->where($where); + } else { + $query->where('status', $status); + } + } + } + + if ($request->has('customer_id')) { + $customer_id = $request->input('customer_id'); + if (!empty($customer_id)) { + $query->where('customer_id', $customer_id); + } + } + + if ($request->has('customer_id')) { + $customer_id = $request->input('customer_id'); + if (!empty($customer_id)) { + $query->where('customer_id', $customer_id); + } + } + + if ($request->has('member_id')) { + $member_id = $request->input('member_id'); + if (!empty($member_id)) { + $query->where('member_id', $member_id); + } + } + + // 分页 + $page = $request->input('page', 1); + $perPage = $request->input('per_page', 10); + $query->orderBy('id'); + $total = $query->count(); + $_this = $this; + $items = $query->latest()->forPage($page, $perPage)->get()->each( + function ($item) use ($_this) { + $item['parking_name'] = Parking::queryName($item['floor_id']); + return $_this->service->optionItems($item); + } + ); + + return $this->responseService->success([ + 'items' => $items, + 'total' => $total, + 'page' => $page, + 'per_page' => $perPage, + 'last_page' => ceil($total / $perPage), + ]); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } +} diff --git a/app/Http/Controllers/Admin/ParkingSpaceController.php b/app/Http/Controllers/Admin/ParkingSpaceController.php index 1b7cef2..83544f5 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceController.php @@ -137,8 +137,7 @@ class ParkingSpaceController extends BaseController { try { $data = [ - 'floor_data' => AdminFloor::query()->select(['id', 'name']) - ->get()->toArray(), + 'floor_data' => AdminFloor::getData(), 'space_type_data' => ParkingSpaceType::query()->select( ['id', 'name'] )->get()->toArray(), diff --git a/app/Models/AdminFloor.php b/app/Models/AdminFloor.php index 808f591..6d84d46 100644 --- a/app/Models/AdminFloor.php +++ b/app/Models/AdminFloor.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Services\AdminTranslationService; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -19,11 +20,12 @@ class AdminFloor extends Model 'building_floor' ]; - protected $hidden = [ - 'updated_at', - 'created_at', - 'deleted_at' - ]; + protected $hidden + = [ + 'updated_at', + 'created_at', + 'deleted_at' + ]; public static function getName($id) { @@ -32,6 +34,17 @@ class AdminFloor extends Model public static function getData(): array { - return self::query()->select(['id', 'name'])->get()->toArray(); + return self::query()->where('status', 1)->select(['id', 'name'])->get() + ->each( + function ($item) { + $item['name'] + = AdminTranslationService::getTranslationTypeName( + $item['id'], + 4, + $item['name'] + ); + return $item; + } + )->toArray() ?? []; } } diff --git a/app/Models/AdminTranslation.php b/app/Models/AdminTranslation.php index 9c17d9f..257f1ae 100644 --- a/app/Models/AdminTranslation.php +++ b/app/Models/AdminTranslation.php @@ -25,4 +25,12 @@ class AdminTranslation extends Model 'deleted_at', 'created_at' ]; + + /* + 翻译type 说明 + 1 车位类型 + 2 车位属性 + 3 停车场 + 4 楼层管理 + */ } diff --git a/app/Models/Parking.php b/app/Models/Parking.php index 6f684ee..727fde7 100644 --- a/app/Models/Parking.php +++ b/app/Models/Parking.php @@ -35,9 +35,17 @@ class Parking extends Model public static function getName($id) { - $tr_name = AdminTranslationService::getTranslationName($id, 3); $name = self::query()->where('id', $id)->value('name') ?? ''; - return $tr_name ?: $name; + return AdminTranslationService::getTranslationTypeName($id, 3, $name); + } + + public static function queryName($floor_id) + { + $parking_id = AdminFloor::query()->where('id', $floor_id)->value('building_floor'); + if ($parking_id) { + return self::getName($parking_id); + } + return ''; } public static function getValueId($number) @@ -49,14 +57,15 @@ class Parking extends Model { $columns = ['id', 'name']; return self::query()->where('status', 1)->select($columns)->get()->each( - function ($item) { - $tr_name = AdminTranslationService::getTranslationName( - $item['id'], - 3 - ); - $item['name'] = $tr_name ?: $item['name']; - return $item; - } - )->toArray() ?? []; + function ($item) { + $item['name'] + = AdminTranslationService::getTranslationTypeName( + $item['id'], + 3, + $item['name'] + ); + return $item; + } + )->toArray() ?? []; } } diff --git a/app/Models/ParkingSpace.php b/app/Models/ParkingSpace.php index f38ba02..b87499b 100644 --- a/app/Models/ParkingSpace.php +++ b/app/Models/ParkingSpace.php @@ -22,7 +22,9 @@ class ParkingSpace extends Model 'status', 'space_type_id', 'operation_type', - 'pic_url' + 'pic_url', + 'customer_id', + 'member_id' ]; protected $hidden diff --git a/app/Models/ParkingSpaceAttributes.php b/app/Models/ParkingSpaceAttributes.php index 4849bce..64b229b 100644 --- a/app/Models/ParkingSpaceAttributes.php +++ b/app/Models/ParkingSpaceAttributes.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Services\AdminTranslationService; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -37,16 +38,39 @@ class ParkingSpaceAttributes extends Model { return self::query()->where('is_default', 0)->get()->select( ['id', 'attributes'] - )->toArray(); + )->each(function ($item) { + $item['attributes'] + = AdminTranslationService::getTranslationTypeName( + $item['id'], + 2, + $item['attributes'] + ); + return $item; + })->toArray(); } public static function getAttr($id) { - return self::query()->where('id', $id)->value('attributes') ?? ''; + $attributes = self::query()->where('id', $id)->value('attributes') ?? ''; + return AdminTranslationService::getTranslationTypeName( + $id, + 2, + $attributes); } public static function getData(): array { - return self::query()->select(['id', 'attributes'])->get()->toArray(); + return self::query()->select(['id', 'attributes'])->get() + ->each( + function ($item) { + $item['attributes'] + = AdminTranslationService::getTranslationTypeName( + $item['id'], + 2, + $item['attributes'] + ); + return $item; + } + )->toArray() ?? []; } } diff --git a/app/Models/ParkingSpaceType.php b/app/Models/ParkingSpaceType.php index 62f959c..75c0b5f 100644 --- a/app/Models/ParkingSpaceType.php +++ b/app/Models/ParkingSpaceType.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Services\AdminTranslationService; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -38,7 +39,17 @@ class ParkingSpaceType extends Model public static function getData(): array { - return self::query()->select(['id', 'name'])->get()->toArray(); + return self::query()->select(['id', 'name'])->get()->each( + function ($item) { + $item['name'] + = AdminTranslationService::getTranslationTypeName( + $item['id'], + 1, + $item['name'] + ); + return $item; + } + )->toArray() ?? []; } // 获取默认车位类型 diff --git a/app/Services/AdminTranslationService.php b/app/Services/AdminTranslationService.php index 09b5d97..0a9c3f7 100644 --- a/app/Services/AdminTranslationService.php +++ b/app/Services/AdminTranslationService.php @@ -208,4 +208,11 @@ class AdminTranslationService throw $e; } } + + // 返回翻译类型内容 + public static function getTranslationTypeName($type_id, $type, $name) + { + $tr_name = self::getTranslationName($type_id, $type); + return $tr_name ?: $name; + } } diff --git a/app/Services/ParkingSpaceService.php b/app/Services/ParkingSpaceService.php index 0cd88b6..36a9c94 100644 --- a/app/Services/ParkingSpaceService.php +++ b/app/Services/ParkingSpaceService.php @@ -20,7 +20,7 @@ class ParkingSpaceService extends BaseService /** * @var string[] */ - protected array $statusArr = ['vacant', 'occupy']; + protected array $statusArr = ['vacant', 'occupy','repair']; protected array $operationType = [ '', @@ -67,11 +67,19 @@ class ParkingSpaceService extends BaseService return '-'; } - public function getStatusArr(): array + public function getStatusArr($is_child = false): array { $arr = []; foreach ($this->statusArr as $key => $value) { $arr[$key] = __('service.parking_space.' . $value); + if ($value == 'occupy' && $is_child) { + $arr['child'] = [ + $key => [ + 3 => __('service.parking_space.yes_license'), + 4 => __('service.parking_space.no_license') + ] + ]; + } } return $arr; } diff --git a/app/common.php b/app/common.php index 170267b..dfdc928 100644 --- a/app/common.php +++ b/app/common.php @@ -62,6 +62,39 @@ if (!function_exists('get_select_data')) { return $newData; } } +if (!function_exists('get_select_child_data')) { + function get_select_child_data( + array $data = [], + bool $is_all = false, + string $str1 = 'label', + string $str2 = 'value' + ): array { + $newData = []; + if ($is_all) { + $newData[] = [$str1 => __('admin.all'), $str2 => '']; + } + $child = $data['child'] ?? []; + foreach ($data as $key => $value) { + if ($key == 'child') { + continue; + } + $arr = [ + $str1 => $value, + $str2 => $key + ]; + if (isset($child[$key])) { + foreach ($child[$key] as $childKey => $childValue) { + $arr['child'][] = [ + $str1 => $childValue, + $str2 => $childKey + ]; + } + } + $newData[] = $arr; + } + return $newData; + } +} if (!function_exists('get_ratio')) { function get_ratio($max, $min, $is_unit = true): string diff --git a/database/migrations/2026_02_10_173627_create_admin_floor_table.php b/database/migrations/2026_02_10_173627_create_admin_floor_table.php index 5121dd8..b43bc82 100644 --- a/database/migrations/2026_02_10_173627_create_admin_floor_table.php +++ b/database/migrations/2026_02_10_173627_create_admin_floor_table.php @@ -16,6 +16,7 @@ return new class extends Migration $table->string('name')->comment('楼层名称'); $table->string('image_url')->comment('图片路径'); $table->integer('building_floor')->default(1)->comment('所属楼'); + $table->tinyInteger('status')->default(1)->comment('状态'); $table->timestamps(); $table->softDeletes(); $table->innoDb(); diff --git a/database/migrations/2026_03_23_143449_create_parking_space_table.php b/database/migrations/2026_03_23_143449_create_parking_space_table.php index 9f4bdab..51f0a58 100644 --- a/database/migrations/2026_03_23_143449_create_parking_space_table.php +++ b/database/migrations/2026_03_23_143449_create_parking_space_table.php @@ -24,6 +24,8 @@ return new class extends Migration $table->tinyInteger('operation_type')->default(0)->comment('操作类型'); $table->string('pic_url', 255)->nullable()->default('')->comment('车位图片'); //$table->integer('auxiliary_space_type')->nullable()->comment('附属车位类型'); + $table->string('customer_id', 50)->default('')->comment('客户ID'); + $table->string('member_id', 50)->default('')->comment('会员ID'); $table->timestamps(); }); } diff --git a/resources/lang/en/service.php b/resources/lang/en/service.php index 91527e2..11d4208 100644 --- a/resources/lang/en/service.php +++ b/resources/lang/en/service.php @@ -52,6 +52,9 @@ return [ 'parking_space' => [ 'vacant' => 'vacant', 'occupy' => 'occupy', + 'repair' => 'Under repair', + 'yes_license' => 'There is a license plate', + 'no_license' => 'No license plate', 'high' => 'high', 'middle' => 'middle', 'land' => 'land', diff --git a/resources/lang/zh-CN/service.php b/resources/lang/zh-CN/service.php index 8c193ee..988646b 100644 --- a/resources/lang/zh-CN/service.php +++ b/resources/lang/zh-CN/service.php @@ -52,6 +52,9 @@ return [ 'parking_space' => [ 'vacant' => '空置', 'occupy' => '占用', + 'repair' => '维修中', + 'yes_license' => '有车牌', + 'no_license' => '无车牌', 'high' => '高', 'middle' => '中', 'land' => '低', diff --git a/resources/lang/zh-TW/service.php b/resources/lang/zh-TW/service.php index b36c049..ddeb61e 100644 --- a/resources/lang/zh-TW/service.php +++ b/resources/lang/zh-TW/service.php @@ -52,6 +52,9 @@ return [ 'parking_space' => [ 'vacant' => '空置', 'occupy' => '佔用', + 'repair' => '維修中', + 'yes_license' => '有車牌', + 'no_license' => '無車牌', 'high' => '高', 'middle' => '中', 'land' => '低', diff --git a/routes/admin/api.php b/routes/admin/api.php index fb3a45e..e189b01 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -28,6 +28,7 @@ use App\Http\Controllers\Admin\NoticeController; use App\Http\Controllers\Admin\LicensePlateRecognitionController; use App\Http\Controllers\Admin\ParkingBehaviorController; use App\Http\Controllers\Admin\ParkingManagementController; +use App\Http\Controllers\Admin\ParkingManagementListController; Route::group(['prefix' => 'admin'], function () { @@ -214,6 +215,10 @@ Route::group(['prefix' => 'admin'], function () { Route::put('/parkingManagement/{id}', [ParkingManagementController::class, 'update']); Route::delete('/parkingManagement/{id}', [ParkingManagementController::class, 'destroy']); Route::get('/parkingManagement/rule', [ParkingManagementController::class, 'rule']); + // 停车列表 + Route::get('/parkingManagementList/search', [ParkingManagementListController::class, 'search']); + Route::get('/parkingManagementList', [ParkingManagementListController::class, 'index']); + Route::get('/parkingManagementList/rule', [ParkingManagementListController::class, 'rule']); // 角色 Route::get('/roles', [RolesController::class, 'index']); Route::get('/roles/create', [RolesController::class, 'create']);