停车场管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

158 lines
5.3 KiB

<?php
namespace App\Http\Controllers\Device;
use App\Models\ParkingAccessRecord;
use App\Models\ParkingCamera;
use App\Models\ParkingSpace;
use App\Models\ParkingSpaceCamera;
use App\Services\HikParkingCameraService;
use App\Services\ParkingAccessRecordService;
use App\Services\ParkingCameraService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CameraApiController extends BaseController
{
/**
* @var ParkingCameraService
*/
protected ParkingCameraService $service;
/**
* @param ParkingCameraService $service
*/
public function __construct(ParkingCameraService $service) {
parent::__construct();
$this->service = $service;
}
public function getCameraData(): JsonResponse
{
$data = ParkingCamera::query()->where('camera_ip', '<>', '192.168.66.63')->select(['id', 'camera_ip', 'status'])
->get()
->toArray();
return $this->responseService->success(['list' => $data]);
}
public function updateCameraStatus(Request $request): JsonResponse
{
$data = $request->all();
$list = $data['list'];
foreach ($list as $item) {
$id = $item['id'] ?? 0;
$camera_ip = $item['camera_ip'] ?? '';
$status = $item['status'] ?? 0;
$this->service->updateStatus($id, $camera_ip, $status);
}
return $this->responseService->success([], 'SUCCESS');
}
public function getCameraBody(): JsonResponse
{
$body = HikParkingCameraService::getBody();
if (!$body) {
return $this->responseService->error('empty');
}
return $this->responseService->success($body, 'SUCCESS');
}
// 变等完成回调完成
public function setCameraBody(Request $request): JsonResponse
{
$data = $request->all();
$id = $data['id'] ?? 0;
if ($id && is_numeric($id)) {
HikParkingCameraService::sendSuccessful($id);
return $this->responseService->success([], 'SUCCESS');
}
return $this->responseService->error('empty');
}
// 获取在线状态设备
public function onlineCamera(): JsonResponse
{
$data = [];
$cameraRes = ParkingCamera::query()->where('status', 1)->select(
['id', 'camera_ip']
)->get()->toArray();
if ($cameraRes) {
$cameraArr = array_column($cameraRes, 'camera_ip', 'id');
$cameraIds = array_keys($cameraArr);
$spaceCameraRes = ParkingSpaceCamera::query()->whereIn(
'camera_id',
$cameraIds
)
->where('space_id', '>', 0)->select(['camera_id', 'space_id'])
->get()->toArray();
foreach ($spaceCameraRes as $item) {
// 非维修车辆返回
$spaceRes = ParkingSpace::query()->where(
'id',
$item['space_id']
)->first(
['number', 'status', 'floor_id']
);
if ($spaceRes) {
$number = $spaceRes['number'];
$status = $spaceRes['status'];
$exists = true;
if ($status == 2) {
$where = [
'space_id' => $item['space_id'],
'floor_id' => $spaceRes['floor_id'],
'status' => 1
];
$exists = ParkingAccessRecord::query()->where($where)->exists();
}
if ($exists) {
$data[] = [
'camera_ip' => $cameraArr[$item['camera_id']],
'number' => $number
];
}
}
}
}
return $this->responseService->success(['list' => $data]);
}
// 车辆进出入
public function vehicleEntry(Request $request): JsonResponse
{
$data = $request->all();
$list = $data['list'] ?? [];
DB::beginTransaction();
try {
if (!$list) {
throw new \Exception('empty');
}
foreach ($list as $item) {
$camera_ip = $item['camera_ip'] ?? '';
$number = $item['number'] ?? '';
$license_plate = $item['license_plate_number'] ?? '';
$date_time = $item['date_time'] ?? date("Y-m-d H:i:s", time());
$image_data = $item['image_data'] ?? '';
$confidenceLevel = $item['confidenceLevel'] ?? '0';
if ($camera_ip && $number) {
ParkingAccessRecordService::query()->enterOrLeave(
$camera_ip,
$number,
$license_plate,
$date_time,
$image_data,
$confidenceLevel
);
}
}
DB::commit();
return $this->responseService->success([], 'SUCCESS');
} catch (\Exception $e) {
DB::rollBack();
return $this->responseService->error('FAILURE');
}
}
}