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