|
@@ -28,6 +28,7 @@ public class ParkingFeeCalculator {
|
|
|
public LocalDateTime monthlyCardExpiryTime; // 月卡到期时间
|
|
|
public double paidAmount; // 已支付金额
|
|
|
public List<PaymentRecord> paymentRecords = new ArrayList<>(); // 支付记录
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// 支付记录类
|
|
@@ -53,13 +54,25 @@ public class ParkingFeeCalculator {
|
|
|
Duration billingDuration = Duration.between(billingStartTime, billingEndTime);
|
|
|
|
|
|
// 4. 检查离场时长宽容度
|
|
|
- if (feeRule.gracePeriodMinutes > 0) {
|
|
|
+ /*if (feeRule.gracePeriodMinutes > 0) {
|
|
|
for (PaymentRecord payment : parkingRecord.paymentRecords) {
|
|
|
if (payment.paymentTime.isAfter(billingEndTime.minusMinutes(feeRule.gracePeriodMinutes))) {
|
|
|
billingDuration = billingDuration.minusMinutes(feeRule.gracePeriodMinutes);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ }*/
|
|
|
+ if (feeRule.gracePeriodMinutes > 0 && !parkingRecord.paymentRecords.isEmpty()) {
|
|
|
+ // 获取最后一次支付时间
|
|
|
+ LocalDateTime lastPaymentTime = parkingRecord.paymentRecords.stream()
|
|
|
+ .map(payment -> payment.paymentTime)
|
|
|
+ .max(LocalDateTime::compareTo)
|
|
|
+ .orElse(null);
|
|
|
+
|
|
|
+ // 检查最后一次支付时间是否在离场时长宽容度内
|
|
|
+ if (lastPaymentTime != null && Duration.between(lastPaymentTime, billingEndTime).toMinutes() <= feeRule.gracePeriodMinutes) {
|
|
|
+ billingDuration = billingDuration.minusMinutes(feeRule.gracePeriodMinutes);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 5. 判断是否在免费时长内
|
|
@@ -131,21 +144,24 @@ public class ParkingFeeCalculator {
|
|
|
public static void e2(){
|
|
|
// 示例计费规则
|
|
|
FeeRule feeRule = new FeeRule();
|
|
|
- feeRule.freeDurationMinutes = 10;
|
|
|
- feeRule.firstCycleFee = 20.0;
|
|
|
- feeRule.firstCycleDurationMinutes = 120;//首周期计费时长
|
|
|
+ feeRule.freeDurationMinutes = 10;//免费时长
|
|
|
+ feeRule.firstCycleFee = 20.0;//首周期计费金额
|
|
|
+ feeRule.firstCycleDurationMinutes = 60;//首周期计费时长
|
|
|
feeRule.cycleDurationMinutes = 30;//计费周期
|
|
|
- feeRule.cycleFee = 5.0;//每周期计费金额
|
|
|
- feeRule.dailyCapFee = 50.0;//24小时封顶费用
|
|
|
+ feeRule.cycleFee = 2;//每周期计费金额
|
|
|
+ feeRule.dailyCapFee = 30;//24小时封顶费用
|
|
|
feeRule.gracePeriodMinutes = 15;// 离场时长宽容度(分钟)
|
|
|
|
|
|
// 示例停车记录
|
|
|
ParkingRecord parkingRecord = new ParkingRecord();
|
|
|
- parkingRecord.entryTime = LocalDateTime.of(2025, 3, 4, 0, 0);
|
|
|
- parkingRecord.exitTime = LocalDateTime.of(2025, 3, 5, 0, 16);
|
|
|
+ parkingRecord.entryTime = LocalDateTime.of(2025, 3, 13, 15, 39);
|
|
|
+ parkingRecord.exitTime = LocalDateTime.of(2025, 3, 13, 16, 45);
|
|
|
parkingRecord.monthlyCardExpiryTime = null;
|
|
|
- parkingRecord.paidAmount = 0.0;//已支付金额
|
|
|
-
|
|
|
+ parkingRecord.paidAmount = 0.01;//已支付金额
|
|
|
+ parkingRecord.paymentRecords=new ArrayList<>();
|
|
|
+ PaymentRecord paymentRecord = new PaymentRecord();
|
|
|
+ paymentRecord.paymentTime = LocalDateTime.of(2025, 3, 13, 16, 29);
|
|
|
+ parkingRecord.paymentRecords.add(paymentRecord);
|
|
|
// 计算费用
|
|
|
double fee = calculateParkingFee(parkingRecord, feeRule, false);
|
|
|
System.out.println("停车费用: " + fee + " 元");
|
|
@@ -167,8 +183,8 @@ public class ParkingFeeCalculator {
|
|
|
|
|
|
// 示例停车记录
|
|
|
ParkingRecord parkingRecord = new ParkingRecord();
|
|
|
- parkingRecord.entryTime = LocalDateTime.of(2025, 3, 3, 0, 0);
|
|
|
- parkingRecord.exitTime = LocalDateTime.of(2025, 3, 8, 10, 0);
|
|
|
+ parkingRecord.entryTime = LocalDateTime.of(2025, 3, 3, 15, 39);
|
|
|
+ parkingRecord.exitTime = LocalDateTime.of(2025, 3, 3, 16, 42);
|
|
|
parkingRecord.monthlyCardExpiryTime = null;
|
|
|
parkingRecord.paidAmount = 0.0;//已支付金额
|
|
|
|
|
@@ -180,7 +196,7 @@ public class ParkingFeeCalculator {
|
|
|
* @param args
|
|
|
*/
|
|
|
public static void main(String[] args) {
|
|
|
- e1();
|
|
|
-// e2();
|
|
|
+// e1();
|
|
|
+ e2();
|
|
|
}
|
|
|
}
|