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