Java停车收费规则设计方案

1. 项目概述

本项目旨在设计一个停车场收费系统,用于管理停车场的进出车辆,并根据车辆停留的时间计算停车费用。系统实现以下功能:

  • 记录车辆的进入和离开时间
  • 根据停车时间计算费用
  • 支持多种计费规则
  • 提供统计报表功能

2. 系统设计

2.1 类图

下面是停车收费系统的类图:

classDiagram
    class ParkingLot {
        -parkedVehicles: Map<String, Vehicle>
        -parkingRate: ParkingRate
        +enter(vehicleId: String)
        +leave(vehicleId: String): double
        +getOccupiedSpaces(): int
        +getAvailableSpaces(): int
        +getParkedVehicles(): List<Vehicle>
        +getParkingRate(): ParkingRate
    }

    class Vehicle {
        -id: String
        -entryTime: LocalDateTime
        -exitTime: LocalDateTime
        -parkingRate: ParkingRate
        +Vehicle(id: String, entryTime: LocalDateTime, parkingRate: ParkingRate)
        +exit(exitTime: LocalDateTime)
        +calculateParkingFee(): double
    }

    class ParkingRate {
        +hourlyRate: double
        +minimumParkingFee: double
        +additionalFeePerHour: double
    }

2.2 数据库设计

停车场收费系统需要一个数据库来保存车辆的进出记录,以及收费规则信息。以下是停车记录表和收费规则表的关系图:

erDiagram
    PARKING_LOT ||..|| VEHICLE : contains
    VEHICLE }o..|| PARKING_RATE : uses

停车记录表(PARKING_LOT)包含以下字段:

  • vehicleId: 车辆ID
  • entryTime: 进入时间
  • exitTime: 离开时间

收费规则表(PARKING_RATE)包含以下字段:

  • hourlyRate: 每小时费率
  • minimumParkingFee: 最低停车费用
  • additionalFeePerHour: 超出最低停车时间后每小时额外费用

3. 代码实现

3.1 ParkingLot 类

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParkingLot {
    private Map<String, Vehicle> parkedVehicles;
    private ParkingRate parkingRate;

    public ParkingLot(ParkingRate parkingRate) {
        this.parkedVehicles = new HashMap<>();
        this.parkingRate = parkingRate;
    }

    public void enter(String vehicleId) {
        LocalDateTime entryTime = LocalDateTime.now();
        Vehicle vehicle = new Vehicle(vehicleId, entryTime, parkingRate);
        parkedVehicles.put(vehicleId, vehicle);
    }

    public double leave(String vehicleId) {
        Vehicle vehicle = parkedVehicles.get(vehicleId);
        vehicle.exit(LocalDateTime.now());
        double parkingFee = vehicle.calculateParkingFee();
        parkedVehicles.remove(vehicleId);
        return parkingFee;
    }

    public int getOccupiedSpaces() {
        return parkedVehicles.size();
    }

    public int getAvailableSpaces() {
        // Assuming the total number of spaces is fixed
        int totalSpaces = 100;
        return totalSpaces - parkedVehicles.size();
    }

    public List<Vehicle> getParkedVehicles() {
        return new ArrayList<>(parkedVehicles.values());
    }

    public ParkingRate getParkingRate() {
        return parkingRate;
    }
}

3.2 Vehicle 类

import java.time.Duration;
import java.time.LocalDateTime;

public class Vehicle {
    private String id;
    private LocalDateTime entryTime;
    private LocalDateTime exitTime;
    private ParkingRate parkingRate;

    public Vehicle(String id, LocalDateTime entryTime, ParkingRate parkingRate) {
        this.id = id;
        this.entryTime = entryTime;
        this.parkingRate = parkingRate;
    }

    public void exit(LocalDateTime exitTime) {
        this.exitTime = exitTime;
    }

    public double calculateParkingFee() {
        Duration duration = Duration.between(entryTime, exitTime);
        long hours = duration.toHours();
        double parkingFee = parkingRate.getMinimumParkingFee();
        
        if (hours > 0) {
            parkingFee += parkingRate.getHourlyRate() * (hours - 1);
        }
        
        if (duration.toMinutes() % 60 != 0) {
            parkingFee += parkingRate.getAdditionalFeePerHour();
        }
        
        return parkingFee;
    }
}

3.3 ParkingRate 类

public class ParkingRate {
    private double hourlyRate;
    private double minimumParkingFee;
    private double additionalFeePerHour;

    public ParkingRate(double hourly