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

<?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;
}
}
}