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
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']) && !$id) {
|
|
$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;
|
|
}
|
|
}
|
|
|