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

165 lines
5.4 KiB

<?php
namespace App\Services;
use App\Models\ParkingAccessRecord;
use App\Models\ParkingCamera;
use App\Models\ParkingSpace;
use App\Models\ParkingSpaceCamera;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
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'],
'scene_image' => $data['scene_image'],
'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, $image_data = '')
{
$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);
$data['scene_image'] = $this->saveSceneImage($image_data);
$this->enterData($data);
// 同步车位车辆进入
$ParkingSpaceService->updateEnterLeave(
$space_id,
1,
$now_time,
$data['license_plate_id'].
$data['scene_image']
);
}
}
// 手动添加车辆进出记录
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);
}
}
// 保存场景图
public function saveSceneImage($imageData): string
{
$scene_image = '';
if ($imageData) {
$filename = time() . '_' . md5(Str::random(6)) . '.jpg';
$save_file_path = 'public/images/scene/' . date("Ymd") . '/' . $filename;
$deBaseData = base64_decode($imageData);
Storage::put($save_file_path, $deBaseData);
$scene_image = Storage::url($save_file_path);
}
return $scene_image;
}
}