diff --git a/app/Http/Controllers/Admin/ParkingLicensePlateController.php b/app/Http/Controllers/Admin/ParkingLicensePlateController.php index b1cd9fe..79c465b 100644 --- a/app/Http/Controllers/Admin/ParkingLicensePlateController.php +++ b/app/Http/Controllers/Admin/ParkingLicensePlateController.php @@ -6,6 +6,8 @@ use App\Exceptions\CustomException; use App\Exports\ParkingLicensePlateImportTemplateExport; use App\Imports\ParkingLicensePlateImport; use App\Models\ParkingLicensePlate; +use App\Models\ParkingSpace; +use App\Models\ParkingSpaceAttributes; use App\Models\ParkingSpaceType; use App\Services\ApiResponseService; use App\Services\ParkingLicensePlateService; @@ -306,4 +308,38 @@ class ParkingLicensePlateController extends BaseController ); } } + + public function view(Request $request): JsonResponse + { + try { + $license_plate = $request->post('license_plate', ''); + $license_plate_id = ParkingLicensePlate::getValueId($license_plate); + + if (!$license_plate_id) { + throw new Exception(''); + } + + $parkingSpace = ParkingSpace::query()->where( + 'license_plate_id', + $license_plate_id + )->first(['id', 'number', 'space_attr_id', 'space_type_id']) ?? 0; + if (!$parkingSpace) { + throw new Exception(''); + } + $space_attr = ParkingSpaceAttributes::getAttr($parkingSpace['space_attr_id']); + $space_type_name = ParkingSpaceType::getName($parkingSpace['space_type_id']); + $data = [ + 'license_plate' => $license_plate, + 'parking_space_id' => $parkingSpace['id'], + 'parking_space_number' => $parkingSpace['number'], + 'parking_space_attr' => $space_attr, + 'parking_space_type' => $space_type_name + ]; + return $this->responseService->success($data); + } catch (Exception $e) { + return $this->responseService->systemError( + __('controller.license_plate.not_put') + ); + } + } } diff --git a/app/Http/Controllers/Admin/ParkingSpaceController.php b/app/Http/Controllers/Admin/ParkingSpaceController.php index d3ceee3..5b9baf8 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceController.php @@ -244,4 +244,54 @@ class ParkingSpaceController extends Controller __('exports.parking_space.list') . time() . '.xlsx' ); } + + public function information(Request $request): JsonResponse + { + try { + $data = []; + + $parking_space_id = $request->post('parking_space_id', ''); + + $item = ParkingSpace::query()->where('id', $parking_space_id) + ->first(); + if (empty($item)) { + throw new Exception(__('controller.parking_space.not_space')); + } + + $statusArr = $this->service->getStatusArr(); + + $data['parking_space_number'] = $item['number']; + $data['license_plate'] = ParkingLicensePlate::getNumber($item['license_plate_id']); + $data['status'] = $statusArr[$item['status']]; + $data['parking_space_type'] = ParkingSpaceType::getName($item['space_type_id']); + $data['berthing_time_str'] = ''; + if ($item['berthing_time']) { + $difference = get_time_difference($item['berthing_time']); + if (!isset($difference['error'])) { + if (!empty($difference['days'])) { + $data['berthing_time_str'] .= $difference['days'] . __('controller.parking_space.days'); + } + if (!empty($difference['hours']) || !empty($data['berthing_time_str'])) { + $data['berthing_time_str'] .= $difference['hours'] . __('controller.parking_space.hours'); + } + if (!empty($difference['minutes']) || !empty($data['berthing_time_str'])) { + $data['berthing_time_str'] .= $difference['minutes'] . __('controller.parking_space.minutes'); + } + if (!empty($difference['seconds']) || !empty($data['berthing_time_str'])) { + $data['berthing_time_str'] .= $difference['seconds'] . __('controller.parking_space.seconds'); + } + } + } + $data['recognition'] = $this->service->getRecognition( + $item['recognition'] + ); + $data['space_url'] = ''; + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } } diff --git a/app/Models/ParkingLicensePlate.php b/app/Models/ParkingLicensePlate.php index 344e641..2e6ff41 100644 --- a/app/Models/ParkingLicensePlate.php +++ b/app/Models/ParkingLicensePlate.php @@ -28,6 +28,11 @@ class ParkingLicensePlate extends Model return self::query()->where('id', $id)->value('number') ?? ''; } + public static function getValueId($number) + { + return self::query()->where('number', $number)->value('id') ?? ''; + } + public static function getId($number) { return self::query()->where('number', 'like', "%{$number}%")->pluck( diff --git a/app/Models/ParkingSpace.php b/app/Models/ParkingSpace.php index 08d09e4..9c5458b 100644 --- a/app/Models/ParkingSpace.php +++ b/app/Models/ParkingSpace.php @@ -40,6 +40,16 @@ class ParkingSpace extends Model ); } + public function getBerthingTimeAttribute($value): string + { + return is_null($value) + ? '' + : get_datetime( + 'date_time', + strtotime($value) + ); + } + public static function getNumber($id) { return self::query()->where('id', $id)->value('number'); diff --git a/app/common.php b/app/common.php index 4c78628..3fbc5b3 100644 --- a/app/common.php +++ b/app/common.php @@ -75,3 +75,44 @@ if (!function_exists('get_ratio')) { return $ratio; } } + +if (!function_exists('get_time_difference')) { + function get_time_difference(string $targetTime): array + { + try { + $target = new DateTime($targetTime); + $now = new DateTime(); + + // 计算差值 + $interval = $now->diff($target); + + $totalDays = $interval->days; + $hours = $interval->h; + $minutes = $interval->i; + $seconds = $interval->s; + + // 判断是过去还是未来 + $isFuture = $now < $target; + + return [ + 'days' => $totalDays, + 'hours' => $hours, + 'minutes' => $minutes, + 'seconds' => $seconds, + 'is_future' => $isFuture, + 'formatted' => sprintf( + "%s%d天 %02d时 %02d分 %02d秒", + $isFuture ? '' : '-', + $totalDays, + $hours, + $minutes, + $seconds + ) + ]; + } catch (Exception $e) { + return [ + 'error' => '时间格式错误: ' . $e->getMessage() + ]; + } + } +} diff --git a/resources/lang/zh-CN/controller.php b/resources/lang/zh-CN/controller.php index 4ae735a..5531cb0 100644 --- a/resources/lang/zh-CN/controller.php +++ b/resources/lang/zh-CN/controller.php @@ -28,9 +28,17 @@ return [ 'success' => '导入成功' ], 'license_plate' => [ - 'clear_success' => '清除成功' + 'clear_success' => '清除成功', + 'not_put' => '请输入正确的车牌号' ], 'parking_pattern' => [ 'not_parking_space' => '当前模式没有 [优越] 车位' + ], + 'parking_space' => [ + 'days' => '天', + 'hours' => '时', + 'minutes' => '分', + 'seconds' => '秒', + 'not_space' => '未查询到车位信息' ] ]; diff --git a/routes/admin/api.php b/routes/admin/api.php index b7155c0..0ab2267 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -87,6 +87,7 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/parkingSpace/search', [ParkingSpaceController::class, 'search']); Route::post('parkingSpace/updateType', [ParkingSpaceController::class, 'updateType']); Route::post('parkingSpace/updateAttr', [ParkingSpaceController::class, 'updateAttr']); + Route::post('parkingSpace/information', [ParkingSpaceController::class, 'information']); //车位类型管理 Route::get('/spaceType', [ParkingSpaceTypeController::class, 'index']); Route::get('/spaceType/create', [ParkingSpaceTypeController::class, 'create']); @@ -104,6 +105,8 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/licensePlate/clear/{id}', [ParkingLicensePlateController::class, 'clear']); Route::post('/licensePlate/import', [ParkingLicensePlateController::class, 'import']); Route::get('/licensePlate/rule', [ParkingLicensePlateController::class, 'rule']); + Route::post('/licensePlate/view', [ParkingLicensePlateController::class, 'view']); + // 车位属性管理 Route::get('/spaceAttr', [ParkingSpaceAttributesController::class, 'index']); Route::post('/spaceAttr', [ParkingSpaceAttributesController::class, 'store']);