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.
177 lines
6.2 KiB
177 lines
6.2 KiB
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\AdminUsers;
|
|
use App\Models\Parking;
|
|
use App\Models\ParkingChannel;
|
|
use App\Models\ParkingGateControl;
|
|
use App\Models\ParkingLicensePlate;
|
|
use App\Models\ParkingReservation;
|
|
use App\Models\ParkingSpaceType;
|
|
use Exception;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ParkingGateControlService extends BaseService
|
|
{
|
|
public static array $typeArr
|
|
= [
|
|
1 => 'automatic',
|
|
2 => 'manual'
|
|
];
|
|
protected string $menuTitle = 'gate_control';
|
|
|
|
public function getItem($item)
|
|
{
|
|
$typeArr = $this->getType();
|
|
|
|
$item['reserve_id'] = ParkingReservation::query()->where(
|
|
'id',
|
|
$item['reservation_id']
|
|
)->value(
|
|
'reserve_id'
|
|
);
|
|
$item['member_type'] = ParkingSpaceType::getName($item['member_type']);
|
|
$item['license_plate'] = ParkingLicensePlate::getNumber(
|
|
$item['license_plate_id']
|
|
);
|
|
$ParkingChannel = ParkingChannel::getFirst($item['channel_id']);
|
|
$item['channel'] = '';
|
|
$item['parking'] = '';
|
|
if ($ParkingChannel) {
|
|
$item['channel'] = $ParkingChannel['name'];
|
|
$item['parking'] = Parking::getName($ParkingChannel['parking_id']);
|
|
}
|
|
$item['enter_type_str'] = $typeArr[$item['enter_type']];
|
|
$item['leave_type_str'] = $typeArr[$item['leave_type']] ?? '';
|
|
$item['dwell_time'] = get_time_difference_str(
|
|
$item['enter_at'],
|
|
$item['leave_at']
|
|
);
|
|
|
|
$item['enter_img'] = get_image_url($item['enter_img']);
|
|
$item['leave_img'] = get_image_url($item['leave_img']);
|
|
$item['admin_username'] = $item['admin_user_id'] ? AdminUsers::getUsername($item['admin_user_id']) : '';
|
|
unset($item['license_plate_id'], $item['channel_id'], $item['reservation_id'], $item['free_passage'], $item['admin_user_id']);
|
|
return $item;
|
|
}
|
|
|
|
/**
|
|
* @return array|string[]
|
|
*/
|
|
public function getType(): array
|
|
{
|
|
$typeArr = self::$typeArr;
|
|
foreach ($typeArr as $key => $value) {
|
|
$typeArr[$key] = __service($this->menuTitle . '.' . $value);
|
|
}
|
|
return $typeArr;
|
|
}
|
|
|
|
public function enterModel($data)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$number = $data['number'];
|
|
$enter_time = $data['enter_time'];
|
|
$is_reservation = $data['is_reservation'] ?? 0;
|
|
$date = date("Y-m-d", strtotime($enter_time));
|
|
$reservation_id = 0;
|
|
$license_plate_id = '';
|
|
$member_type = 0;
|
|
$customer_id = '';
|
|
$member_id = '';
|
|
$ParkingReservation = ParkingReservation::query()->where([
|
|
'reserve_id' => $number,
|
|
'status' => 1,
|
|
'date' => $date
|
|
])->first();
|
|
if ($ParkingReservation) {
|
|
$reservation_id = $ParkingReservation['id'];
|
|
$license_plate_id = $ParkingReservation['license_plate_id'];
|
|
$member_type = $ParkingReservation['member_type'];
|
|
$customer_id = $ParkingReservation['customer_id'];
|
|
$member_id = $ParkingReservation['member_id'];
|
|
}
|
|
$enter_img = $data['enter_img'] ?? '';
|
|
$channel_id = $data['channel_id'];
|
|
if (!$license_plate_id) {
|
|
$license_plate_id = (new ParkingLicensePlateService(
|
|
$this->logService
|
|
))->createLicenseId($number);
|
|
}
|
|
|
|
$id = ParkingGateControl::query()->where(
|
|
'license_plate_id',
|
|
$license_plate_id
|
|
)->whereNull('leave_at')->value('id');
|
|
if ($id) {
|
|
throw new Exception(
|
|
__service($this->menuTitle . '.cat_exists')
|
|
);
|
|
}
|
|
|
|
$model = ParkingGateControl::query()->create([
|
|
'license_plate_id' => $license_plate_id,
|
|
'channel_id' => $channel_id,
|
|
'enter_type' => 2,
|
|
'enter_img' => $enter_img,
|
|
'enter_at' => $enter_time,
|
|
'reservation_id' => $reservation_id,
|
|
'member_type' => $member_type,
|
|
'customer_id' => $customer_id,
|
|
'member_id' => $member_id,
|
|
'admin_user_id' => $data['admin_user_id'],
|
|
'created_at' => get_datetime()
|
|
]);
|
|
$this->logService->logCreated($model, $this->menuTitle . '.create_enter');
|
|
DB::commit();
|
|
return $model;
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function leaveModel($data)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$license_plate = $data['license_plate'];
|
|
$leave_time = $data['leave_time'];
|
|
$leave_img = $data['leave_img'] ?? '';
|
|
$free_passage = $data['free_passage'] ?? 0;
|
|
$license_plate_id = (new ParkingLicensePlateService(
|
|
$this->logService
|
|
))->createLicenseId($license_plate);
|
|
$id = ParkingGateControl::query()->where(
|
|
'license_plate_id',
|
|
$license_plate_id
|
|
)->whereNull('leave_at')->value('id');
|
|
if (!$id) {
|
|
throw new Exception(
|
|
__service($this->menuTitle . '.cat_not_exists')
|
|
);
|
|
}
|
|
$model = ParkingGateControl::query()->findOrFail($id);
|
|
$oldValue = $model->toArray();
|
|
|
|
$model->update([
|
|
'enter_type' => 2,
|
|
'leave_img' => $leave_img,
|
|
'leave_at' => $leave_time,
|
|
'free_passage' => $free_passage,
|
|
'admin_user_id' => $data['admin_user_id'],
|
|
'updated_at' => get_datetime()
|
|
]);
|
|
$this->logService->logUpdated($model, $oldValue, $this->menuTitle . '.update_leave');
|
|
DB::commit();
|
|
return $model;
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|