Browse Source

停车场列表

master
wanghongjun 3 weeks ago
parent
commit
7b2ce402cc
  1. 182
      app/Http/Controllers/Admin/ParkingManagementListController.php
  2. 3
      app/Http/Controllers/Admin/ParkingSpaceController.php
  3. 25
      app/Models/AdminFloor.php
  4. 8
      app/Models/AdminTranslation.php
  5. 31
      app/Models/Parking.php
  6. 4
      app/Models/ParkingSpace.php
  7. 30
      app/Models/ParkingSpaceAttributes.php
  8. 13
      app/Models/ParkingSpaceType.php
  9. 7
      app/Services/AdminTranslationService.php
  10. 12
      app/Services/ParkingSpaceService.php
  11. 33
      app/common.php
  12. 1
      database/migrations/2026_02_10_173627_create_admin_floor_table.php
  13. 2
      database/migrations/2026_03_23_143449_create_parking_space_table.php
  14. 3
      resources/lang/en/service.php
  15. 3
      resources/lang/zh-CN/service.php
  16. 3
      resources/lang/zh-TW/service.php
  17. 5
      routes/admin/api.php

182
app/Http/Controllers/Admin/ParkingManagementListController.php

@ -0,0 +1,182 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\AdminFloor;
use App\Models\Parking;
use App\Models\ParkingLicensePlate;
use App\Models\ParkingSpace;
use App\Models\ParkingSpaceAttributes;
use App\Services\ApiResponseService;
use App\Services\ParkingSpaceService;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ParkingManagementListController
{
/**
* @var ApiResponseService
*/
protected ApiResponseService $responseService;
/**
* @var ParkingSpaceService
*/
protected ParkingSpaceService $service;
/**
* @param ApiResponseService $responseService
* @param ParkingSpaceService $service
*/
public function __construct(
ApiResponseService $responseService,
ParkingSpaceService $service
) {
$this->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()
);
}
}
}

3
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(),

25
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() ?? [];
}
}

8
app/Models/AdminTranslation.php

@ -25,4 +25,12 @@ class AdminTranslation extends Model
'deleted_at',
'created_at'
];
/*
翻译type 说明
1 车位类型
2 车位属性
3 停车场
4 楼层管理
*/
}

31
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() ?? [];
}
}

4
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

30
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() ?? [];
}
}

13
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() ?? [];
}
// 获取默认车位类型

7
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;
}
}

12
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;
}

33
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

1
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();

2
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();
});
}

3
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',

3
resources/lang/zh-CN/service.php

@ -52,6 +52,9 @@ return [
'parking_space' => [
'vacant' => '空置',
'occupy' => '占用',
'repair' => '维修中',
'yes_license' => '有车牌',
'no_license' => '无车牌',
'high' => '高',
'middle' => '中',
'land' => '低',

3
resources/lang/zh-TW/service.php

@ -52,6 +52,9 @@ return [
'parking_space' => [
'vacant' => '空置',
'occupy' => '佔用',
'repair' => '維修中',
'yes_license' => '有車牌',
'no_license' => '無車牌',
'high' => '高',
'middle' => '中',
'land' => '低',

5
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']);

Loading…
Cancel
Save