停车场管理系统
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.
 
 

146 lines
4.7 KiB

<?php
namespace App\Services;
use App\Models\ParkingAccessRecord;
use App\Models\ParkingCamera;
use App\Models\ParkingSpace;
use App\Models\ParkingSpaceCamera;
class ParkingAccessRecordService extends BaseService
{
protected string $menuTitle = 'access_record';
// 进入车位
public function enterData($data)
{
$data = [
'floor_id' => $data['floor_id'],
'license_plate_id' => $data['license_plate_id'],
'space_id' => $data['space_id'],
'status' => 1,
'enter_time' => $data['enter_time'],
'created_at' => date("Y-m-d H:i:s", time())
];
$model = ParkingAccessRecord::query()->create($data);
$this->logService->logCreated($model, $this->menuTitle . '.create');
}
/**
* @return ParkingAccessRecordService
*/
public static function query(): ParkingAccessRecordService
{
return new self(new OperationLogService());
}
// 离开车位
public function leaveData($id, $data)
{
$model = ParkingAccessRecord::query()->findOrFail($id);
$oldValues = $model->toArray();
$data = [
'status' => 0,
'leave_time' => $data['leave_time'],
'updated_at' => date("Y-m-d H:i:s", time())
];
$model->update($data);
$this->logService->logUpdated(
$model,
$oldValues,
$this->menuTitle . '.update'
);
}
// 车辆进入车位
public function enterOrLeave($camera_ip, $space_number, $license_plate, $now_time)
{
$camera_id = ParkingCamera::query()->where('camera_ip', $camera_ip)
->value('id');
$ParkingSpace = ParkingSpace::query()->where('number', $space_number)
->first();
$exists = false;
$space_id = 0;
$spaceData = [];
if ($ParkingSpace) {
$spaceData = $ParkingSpace->toArray();
$space_id = $spaceData['id'];
$exists = ParkingSpaceCamera::query()->where([
'camera_id' => $camera_id,
'space_id' => $space_id
])->exists();
}
if (!$exists) {
return;
}
$data = [
'space_id' => $space_id,
'floor_id' => $spaceData['floor_id'],
];
// 记录车牌信息
if ($license_plate) {
$licensePlateService = new ParkingLicensePlateService(
$this->logService
);
$license_plate_id = $licensePlateService->saveNumber($license_plate);
$data['license_plate_id'] = $license_plate_id;
}
// 查询车位记录
$id = ParkingAccessRecord::query()->where($data)->where('status', 1)
->value('id');
$ParkingSpaceService = new ParkingSpaceService($this->logService);
// 停播存在车牌不存在
if ($id && !$license_plate) {
$data['leave_time'] = strtotime($now_time);
$this->leaveData($id, $data);
// 同步车位车辆进入
$ParkingSpaceService->updateEnterLeave($space_id, 0, $now_time);
// 车牌存在
} elseif (isset($data['license_plate_id']) && $license_plate) {
$data['enter_time'] = strtotime($now_time);
$this->enterData($data);
// 同步车位车辆进入
$ParkingSpaceService->updateEnterLeave(
$space_id,
1,
$now_time,
$data['license_plate_id']
);
}
}
// 手动添加车辆进出记录
public function syncSpaceStatusRecord(
$floor_id,
$license_plate_id,
$space_id,
$datetime,
$status = 0
) {
$data = [
'space_id' => $space_id,
'floor_id' => $floor_id,
];
$where = [
['space_id', '=', $space_id],
['floor_id', '=', $floor_id]
];
$date_times = strtotime($datetime);
// 车辆进入创建记录
if ($status == 1 && $license_plate_id) {
$data['license_plate_id'] = $license_plate_id;
$data['enter_time'] = $date_times;
$this->enterData($data);
// 查询当前车位是否存在其他未离开车辆,当不包含刚进入车辆
$where[] = ['license_plate_id', '<>', $license_plate_id];
}
// 查询车位进入车辆记录
$id = ParkingAccessRecord::query()->where($where)->where('status', 1)
->value('id');
if ($id) {
$data['leave_time'] = $date_times;
$this->leaveData($id, $data);
}
}
}