diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 48967a7..365db01 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -146,7 +146,7 @@ class Handler extends ExceptionHandler // 其他异常 return app(ApiResponseService::class)->systemError( - __('exception.exception_handler.system') . ':' . $e->getMessage() + __('exception.exception_handler.system') . (env('app_debug') ? ':' . $e->getMessage() : '') ); } } diff --git a/app/Http/Controllers/Admin/ParkingGateControlController.php b/app/Http/Controllers/Admin/ParkingGateControlController.php index f2b0659..bfaf72b 100644 --- a/app/Http/Controllers/Admin/ParkingGateControlController.php +++ b/app/Http/Controllers/Admin/ParkingGateControlController.php @@ -320,4 +320,19 @@ class ParkingGateControlController extends BaseController ); } } + + public function getGateControl(Request $request) + { + try { + $parking_id = $request->get('parking_id'); + $channel_id = $request->get('channel_id', 0); + $data = $this->service->getGateControl($parking_id, $channel_id); + 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/ParkingEquipment.php b/app/Models/ParkingEquipment.php index 037273d..c3f023f 100644 --- a/app/Models/ParkingEquipment.php +++ b/app/Models/ParkingEquipment.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; @@ -33,4 +34,32 @@ class ParkingEquipment extends Model { return $value ? date("Y-m-d H:i:s", strtotime($value)) : $value; } + + public static function getName($id) + { + $name = self::query()->where('id', $id)->value('name'); + return AdminTranslationService::getTranslationTypeName( + $id, + 9, + $name + ); + } + + public static function getFirst($id) + { + $item = self::query()->where('id', $id)->first( + ['id', 'name', 'status'] + ); + if ($item) { + $item = $item->toArray(); + $item['name'] = AdminTranslationService::getTranslationTypeName( + $id, + 9, + $item['name'] + ); + return $item; + } else { + return []; + } + } } diff --git a/app/Models/ParkingGateControl.php b/app/Models/ParkingGateControl.php index a4f9731..277b85f 100644 --- a/app/Models/ParkingGateControl.php +++ b/app/Models/ParkingGateControl.php @@ -25,7 +25,9 @@ class ParkingGateControl extends Model 'member_id', 'free_passage', 'reservation_id', - 'admin_user_id' + 'admin_user_id', + 'leave_remark', + 'equipment_id' ]; protected $hidden diff --git a/app/Services/ParkingGateControlService.php b/app/Services/ParkingGateControlService.php index 9395388..a6d2e19 100644 --- a/app/Services/ParkingGateControlService.php +++ b/app/Services/ParkingGateControlService.php @@ -5,6 +5,7 @@ namespace App\Services; use App\Models\AdminUsers; use App\Models\Parking; use App\Models\ParkingChannel; +use App\Models\ParkingEquipment; use App\Models\ParkingGateControl; use App\Models\ParkingLicensePlate; use App\Models\ParkingReservation; @@ -26,7 +27,7 @@ class ParkingGateControlService extends BaseService 2 => 'leave_remark2', 3 => 'leave_remark3' ]; - + protected string $menuTitle = 'gate_control'; public function getItem($item) @@ -200,5 +201,87 @@ class ParkingGateControlService extends BaseService } } + // 获取通道设备 进出记录 + public function getGateControl($parking_id, $channel_id = 0) + { + $parking_name = Parking::getName($parking_id); + $channel_ids = []; + if ($channel_id) { + $channel_ids[] = $channel_id; + } else { + $channel_ids = ParkingChannel::getIds($parking_id); + if ($channel_ids) { + $channel_ids = $channel_ids->toArray(); + } + } + return [ + 'enter_item' => $this->getGateControlItem($parking_name, $channel_ids), + 'leave_item' => $this->getGateControlItem( + $parking_name, + $channel_ids, + 'leave' + ) + ]; + } + + protected function getGateControlItem( + $parking_name, + $channel_ids = [], + $key = 'enter' + ) { + $time_key = $key . '_at'; + $type_key = $key . '_type'; + $typeArr = $this->getType(); + $data = [ + 'channel_name' => '', // 车道名称 + 'equipment_name' => '', // 设备名称 + 'equipment_status' => 0, // 设备状态 + 'type' => '', // 出/入类型(状态) + 'type_str' => '', // 出/入类型 + 'license_plate' => '', // 车牌号码 + 'parking' => $parking_name, // 停车场 + 'member_type' => '', // 客户类型 + 'time' => '' // 出/入时间 + ]; + $model = ParkingGateControl::query(); + if ($channel_ids) { + $model->whereIn('channel_id', $channel_ids); + } + if ($key == 'leave') { + $model->where('leave_type', '>', 0); + } + $item = $model->orderBy($time_key, 'desc')->first(); + if ($item) { + $item = $item->toArray(); + if ($item) { + $data['channel_name'] = ParkingChannel::getName( + $item['channel_id'] + ); + if ($item['equipment_id']) { + $equipment_item = ParkingEquipment::getFirst( + $item['equipment_id'] + ); + $data['equipment_name'] = $equipment_item['name']; + $data['equipment_status'] = $equipment_item['status']; + } + $data['type'] = $item[$type_key]; + if ($data['type'] == 1) { + $data['type_str'] == __service('gate_control.admission1'); + } else { + $data['type_str'] = $typeArr[$data['type']]; + } + $data['license_plate'] = ParkingLicensePlate::getNumber( + $item['license_plate_id'] + ); + if ($item['member_type']) { + $data['member_type'] = ParkingSpaceType::getName( + $item['member_type'] + ); + } + $data['time'] = $item[$time_key]; + } + } + return $data; + } } diff --git a/database/migrations/2026_06_09_143449_create_parking_gate_control_table.php b/database/migrations/2026_06_09_143449_create_parking_gate_control_table.php index 5af56df..67e0ed6 100644 --- a/database/migrations/2026_06_09_143449_create_parking_gate_control_table.php +++ b/database/migrations/2026_06_09_143449_create_parking_gate_control_table.php @@ -27,6 +27,8 @@ return new class extends Migration $table->tinyInteger('free_passage')->default(0)->comment('免费放行'); $table->integer('reservation_id')->default(0)->comment('预约id'); $table->integer('admin_user_id')->nullable()->comment('操作员'); + $table->tinyInteger('leave_remark')->default(0)->comment('放行原因'); + $table->integer('equipment_id')->default(0)->comment('设备id'); $table->timestamps(); $table->innoDb(); $table->comment('停车场闸机进出记录'); diff --git a/resources/lang/en/service.php b/resources/lang/en/service.php index fbff32b..c2daa2a 100644 --- a/resources/lang/en/service.php +++ b/resources/lang/en/service.php @@ -180,7 +180,8 @@ return [ 'get_error' => 'Failed to obtain', 'leave_remark1' => 'Large lifting vehicles', 'leave_remark2' => 'The vehicle has been paid for', - 'leave_remark3' => 'Special homework vehicles' + 'leave_remark3' => 'Special homework vehicles', + 'admission1' => 'Standard Admission' ], 'prohibited_passage' => [ 'remark1' => 'No appointment, no entry allowed', diff --git a/resources/lang/zh-CN/service.php b/resources/lang/zh-CN/service.php index 426f741..916763e 100644 --- a/resources/lang/zh-CN/service.php +++ b/resources/lang/zh-CN/service.php @@ -180,7 +180,8 @@ return [ 'get_error' => '获取失败', 'leave_remark1' => '大型起重车辆', 'leave_remark2' => '车辆已缴费', - 'leave_remark3' => '特殊作业车辆' + 'leave_remark3' => '特殊作业车辆', + 'admission1' => '正常入场' ], 'prohibited_passage' => [ 'remark1' => '无预约,不可进场', diff --git a/resources/lang/zh-TW/service.php b/resources/lang/zh-TW/service.php index 151495d..dab0015 100644 --- a/resources/lang/zh-TW/service.php +++ b/resources/lang/zh-TW/service.php @@ -180,7 +180,8 @@ return [ 'get_error' => '獲取失敗', 'leave_remark1' => '大型起重車輛', 'leave_remark2' => '車輛已繳費', - 'leave_remark3' => '特殊工作車輛' + 'leave_remark3' => '特殊工作車輛', + 'admission1' => '正常入場' ], 'prohibited_passage' => [ 'remark1' => '無預約,不可進場', diff --git a/routes/admin/api.php b/routes/admin/api.php index 14584dc..5aa6654 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -272,6 +272,7 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/gateControl/getScreenshot', [ParkingGateControlController::class, 'getScreenshot']); Route::post('/gateControl/enter', [ParkingGateControlController::class, 'enter']); Route::post('/gateControl/leave', [ParkingGateControlController::class, 'leave']); + Route::get('/gateControl/index', [ParkingGateControlController::class, 'getGateControl']); // 违禁通行记录 Route::get('/prohibitedPassage', [ProhibitedPassageController::class, 'index']); // 系统总配置