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

287 lines
9.9 KiB

<?php
namespace App\Services;
use App\Models\AdminUsers;
use App\Models\Parking;
use App\Models\ParkingChannel;
use App\Models\ParkingEquipment;
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'
];
public static array $leaveRemarkArr
= [
1 => 'leave_remark1',
2 => 'leave_remark2',
3 => 'leave_remark3'
];
protected string $menuTitle = 'gate_control';
public function getItem($item)
{
$typeArr = $this->getType();
$item['reserve_id'] = '';
if ($item['reservation_id']) {
$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;
}
/**
* @return array|string[]
*/
public function getLeaveRemark(): array
{
$leaveRemarkArr = self::$leaveRemarkArr;
foreach ($leaveRemarkArr as $key => $value) {
$leaveRemarkArr[$key] = __service($this->menuTitle . '.' . $value);
}
return $leaveRemarkArr;
}
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'] ?? '';
$leave_remark = $data['leave_remark'] ?? 0;
$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,
'leave_remark' => $leave_remark,
'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;
}
}
// 获取通道设备 进出记录
public function getGateControl($parking_id, $channel_id = 0)
{
$parking_name = Parking::getName($parking_id);
$channel_ids = [];
if ($channel_id) {
$channel_ids[] = $channel_id;
} else {
$channel_ids = ParkingChannel::getIds($parking_id);
if ($channel_ids) {
$channel_ids = $channel_ids->toArray();
}
}
return [
'enter_item' => $this->getGateControlItem($parking_name, $channel_ids),
'leave_item' => $this->getGateControlItem(
$parking_name,
$channel_ids,
'leave'
)
];
}
protected function getGateControlItem(
$parking_name,
$channel_ids = [],
$key = 'enter'
) {
$time_key = $key . '_at';
$type_key = $key . '_type';
$typeArr = $this->getType();
$data = [
'channel_name' => '', // 车道名称
'equipment_name' => '', // 设备名称
'equipment_status' => 0, // 设备状态
'type' => '', // 出/入类型(状态)
'type_str' => '', // 出/入类型
'license_plate' => '', // 车牌号码
'parking' => $parking_name, // 停车场
'member_type' => '', // 客户类型
'time' => '' // 出/入时间
];
$model = ParkingGateControl::query();
if ($channel_ids) {
$model->whereIn('channel_id', $channel_ids);
}
if ($key == 'leave') {
$model->where('leave_type', '>', 0);
}
$item = $model->orderBy($time_key, 'desc')->first();
if ($item) {
$item = $item->toArray();
if ($item) {
$data['channel_name'] = ParkingChannel::getName(
$item['channel_id']
);
if ($item['equipment_id']) {
$equipment_item = ParkingEquipment::getFirst(
$item['equipment_id']
);
$data['equipment_name'] = $equipment_item['name'];
$data['equipment_status'] = $equipment_item['status'];
}
$data['type'] = $item[$type_key];
if ($data['type'] == 1) {
$data['type_str'] == __service('gate_control.admission1');
} else {
$data['type_str'] = $typeArr[$data['type']];
}
$data['license_plate'] = ParkingLicensePlate::getNumber(
$item['license_plate_id']
);
if ($item['member_type']) {
$data['member_type'] = ParkingSpaceType::getName(
$item['member_type']
);
}
$data['time'] = $item[$time_key];
}
}
return $data;
}
}