service = $service; } public function index(Request $request): JsonResponse { try { $query = ParkingReservation::query(); // 车牌号码搜索 if ($request->has('license_plate')) { $license_plate = $request->input('license_plate'); if (!empty($license_plate)) { $license_plate_id_arr = ParkingLicensePlate::query()->where( 'number', 'like', "%{$license_plate}%" )->pluck('id'); $license_plate_id_arr ? $query->whereIn( 'license_plate_id', $license_plate_id_arr ) : $query->where('id', 0); } } // 楼层 if ($request->has('floor_id')) { $floor_id = $request->input('floor_id'); if (!empty($floor_id)) { $query->where('floor_id', $floor_id); } } if ($request->has('space_number')) { $space_number = $request->input('space_number'); if (!empty($space_number)) { $license_plate_id_arr = ParkingSpace::query()->where( 'number', $space_number )->pluck('license_plate_id'); $license_plate_id_arr ? $query->whereIn( 'license_plate_id', $license_plate_id_arr ) : $query->where('id', 0); } } if ($request->has('space_type_id')) { $space_type_id = $request->input('space_type_id'); if (!empty($space_type_id)) { $query->where('space_type_id', $space_type_id); } } if ($request->has('space_attr_id')) { $space_attr_id = $request->input('space_attr_id'); if (!empty($space_attr_id)) { $query->where('space_attr_id', $space_attr_id); } } if ($request->has('status')) { $status = $request->input('status'); if (!empty($status)) { $query->where('status', $status); } } if ($request->has('parking_id')) { $parking_id = $request->input('parking_id'); if (!empty($parking_id)) { $query->where('parking_id', $parking_id); } } if ($request->has('member_type')) { $member_type = $request->input('member_type'); if (!empty($member_type)) { $query->where('member_type', $member_type); } } if ($request->has('customer_id')) { $customer_id = $request->input('customer_id'); if (!empty($customer_id)) { $query->where('customer_id', $customer_id); } } if ($request->has('member_id')) { $member_id = $request->input('member_id'); if (!empty($member_id)) { $query->where('member_id', $member_id); } } if ($request->has('start_date')) { $start_date = $request->input('start_date'); if (!empty($start_date)) { $query->where('date', '>=', $start_date); } } if ($request->has('end_date')) { $end_date = $request->input('end_date'); if (!empty($end_date)) { $query->where('date', '<=', $end_date); } } if ($request->has('reserve_id')) { $reserve_id = $request->input('reserve_id'); if (!empty($reserve_id)) { $query->where('reserve_id', $reserve_id); } } // 分页 $page = $request->input('page', 1); $perPage = $request->input('per_page', 10); $memberTypeArr = ParkingAdminUserService::$memberType; $total = $query->count(); $items = $query->latest()->forPage($page, $perPage)->get()->each( function ($item) use ($memberTypeArr) { $item['member_type'] = $memberTypeArr[$item['member_type']] ?? ''; $item['channel'] = ParkingChannel::getName($item['channel_id']); $item['parking'] = Parking::getName($item['parking_id']); $item['status'] = $this->service->getStatusStr( $item['status'] ); $item['space_type'] = ParkingSpaceType::getName( $item['space_type_id'] ); $item['space_attr'] = ParkingSpaceAttributes::getAttr( $item['space_attr_id'] ); $item['license_plate'] = ParkingLicensePlate::getNumber( $item['license_plate_id'] ); $item['is_driver'] = $this->service->getIsDriver( $item['is_driver'] ); $item['floor'] = AdminFloor::getName($item['floor_id']); $item['floor_region'] = AdminFloorRegion::getName($item['floor_region_id']); $item['license_plate_type'] = $this->service->getLicensePlateTypeStr($item['license_plate_type']); unset( $item['space_type_id'], $item['license_plate_id'], $item['floor_id'], $item['floor_region_id'], $item['space_attr_id'], $item['channel_id'], $item['parking_id'] ); return $item; } ); return $this->responseService->success([ 'items' => $items, 'total' => $total, 'page' => $page, 'per_page' => $perPage, 'last_page' => ceil($total / $perPage) ]); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } public function search(): JsonResponse { try { $data = [ 'floor_data' => AdminFloor::getData(), 'space_type_data' => ParkingSpaceType::getData(), 'space_attr_data' => ParkingSpaceAttributes::getData(), 'status_data' => get_select_data( $this->service->getStatusArr() ), 'parking_list' => Parking::getData(), 'member_type' => get_select_data(ParkingAdminUserService::$memberType) ]; return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } public function show(Request $request): JsonResponse { try { $id = $request->input('id', 0); $query = ParkingReservation::query(); $query->where('id', $id); $page = $request->input('page', 1); $perPage = $request->input('per_page', 10); $memberTypeArr = ParkingAdminUserService::$memberType; $total = $query->count(); $reservation_number = ''; $items = $query->latest()->forPage($page, $perPage)->get()->each( function ($item) use ($memberTypeArr, &$reservation_number) { $item['member_type'] = $memberTypeArr[$item['member_type']] ?? ''; $item['license_plate'] = ParkingLicensePlate::getNumber( $item['license_plate_id'] ); $item['is_driver'] = $this->service->getIsDriver( $item['is_driver'] ); $item['order_number'] = $item['reserve_id']; $reservation_number = $item['reserve_id']; unset( $item['space_type_id'], $item['license_plate_id'], $item['floor_id'], $item['floor_region_id'], $item['space_attr_id'], $item['channel_id'], $item['parking_id'], $item['status'] ); return $item; } ); return $this->responseService->success([ 'items' => $items, 'total' => $total, 'page' => $page, 'per_page' => $perPage, 'last_page' => ceil($total / $perPage), 'reservation_number' => $reservation_number ]); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') . ':' . $e->getMessage() ); } } public function statistics(Request $request): JsonResponse { try { $start_at = date("Y-m-d 00:00:00"); $end_at = date("Y-m-d 23:59:59"); if ($request->has('appointment_date')) { $appointment_date = $request->input('appointment_date'); if (!empty($appointment_date)) { $start_at = date( "Y-m-d 00:00:00", strtotime($appointment_date) ); $end_at = date( "Y-m-d 23:59:59", strtotime($appointment_date) ); } } $today_count = $this->service->getCount($start_at, $end_at); $present_count = $this->service->getBePresentCount( $start_at, $end_at ); $absent_count = $today_count - $present_count; $data = [ 'today_count' => $today_count, 'present_count' => $present_count, 'absent_count' => max($absent_count, 0) ]; return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } public function getDateStatistics(Request $request): JsonResponse { try { $param = $request->all(); $date = $param['date'] ?? date("Y-m-d", time()); $query = ParkingReservation::query(); $query->where('date', $date); if (isset($param['parking_id'])) { $query->where('parking_id', $param['parking_id']); } $total = $query->count(); $w = date('w', strtotime($date)); $week_str = __service("reservation.week{$w}"); $patternId = EventCalendar::getDatePatternId($date); $space_set_name = ''; if ($patternId) { $space_set_name = ParkingPattern::getName($patternId); } $space_type_ids = $query->pluck('space_type_id')->toArray(); $member_type_list = []; if ($space_type_ids) { $member_type_list = ParkingSpaceType::getData(); $counts = array_count_values((array)$space_type_ids); foreach ($member_type_list as &$item) { $item['count'] = $counts[$item['id']] ?? 0; unset($item['id']); } } $data = [ 'date_str' => $date, 'space_set_name' => $space_set_name, 'total' => $total, 'week_str' => $week_str, 'member_type_list' => $member_type_list ]; return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } }