2 Commits 876af1f1ca ... 84f858a6d8

Author SHA1 Message Date
  loemkie 84f858a6d8 Merge branch 'master' of http://8.138.18.76:3000/qmrb/parking-server 2 weeks ago
  loemkie 76b0160efc 修改计费逻辑 2 weeks ago
1 changed files with 30 additions and 14 deletions
  1. 30 14
      src/main/java/com/qmrb/parking/fee/ParkingFeeCalculator.java

+ 30 - 14
src/main/java/com/qmrb/parking/fee/ParkingFeeCalculator.java

@@ -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();
     }
 }