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.
309 lines
11 KiB
309 lines
11 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 $leaveTypeArr
|
|
= [
|
|
1 => 'automatic2',
|
|
2 => 'manual2'
|
|
];
|
|
|
|
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();
|
|
$leaveTypeArr = $this->getLeaveType();
|
|
|
|
$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'] = $leaveTypeArr[$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 getLeaveType(): array
|
|
{
|
|
$typeArr = self::$leaveTypeArr;
|
|
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 = $key == 'leave' ? $this->getLeaveType() :$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.' .
|
|
($key == 'leave' ? "admission2" : '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;
|
|
}
|
|
|
|
}
|
|
|