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