guoshuai 1 week ago
parent
commit
3290dd61a2

+ 6 - 0
src/main/java/com/qmrb/system/pojo/form/BarnRecordForm.java

@@ -81,6 +81,12 @@ public class BarnRecordForm {
      */
     @Schema(description = "进场图片",type="BigDecimal")
     private BigDecimal pendingAmount;
+    
+    /**
+     * 抵用后金额
+     */
+    @Schema(description = "抵用后金额",type="BigDecimal")
+    private BigDecimal pendingAmountWithCoupon;
     /**
      * 应急取车标识
      */

+ 21 - 0
src/main/java/com/qmrb/system/pojo/vo/BarnRecordVO.java

@@ -1,6 +1,7 @@
 package com.qmrb.system.pojo.vo;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -83,6 +84,12 @@ public class BarnRecordVO {
      */
     @Schema(description = "进场图片",type="BigDecimal")
     private BigDecimal pendingAmount;
+
+    /**
+     * 抵用后金额
+     */
+    @Schema(description = "抵用后金额",type="BigDecimal")
+    private BigDecimal pendingAmountWithCoupon;
     /**
      * 应急取车标识
      */
@@ -105,6 +112,20 @@ public class BarnRecordVO {
      */
     @Schema(description = "抵用",type="BigDecimal")
     private BigDecimal discountAmount;
+    
+    /**
+     * 抵用时长
+     */
+    @Schema(description = "抵用时长",type="BigDecimal")
+    private BigDecimal discountMinute;
+
+
+    /**
+     * 月卡结束日
+     */
+    @Schema(description = "月卡结束日",type="LocalDateTime")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime cardEndTime;
 	@Schema(description = "子分类")
     private List<BarnRecordVO> children;
 

+ 6 - 0
src/main/java/com/qmrb/system/service/ICarParkChargingRulesService.java

@@ -45,4 +45,10 @@ public interface ICarParkChargingRulesService extends IService<CarParkChargingRu
 	 */
 	public BigDecimal calcuExpenses(Long recordId,String carNumber,Boolean isMonthlyCardMode);
 	
+	/**
+	 * 计算费用带优惠券
+	 * @return
+	 */
+	public BigDecimal calcuExpensesWithCoupon(Long recordId,String carNumber,Boolean isMonthlyCardMode);
+	
 }

+ 46 - 4
src/main/java/com/qmrb/system/service/impl/BarnRecordServiceImpl.java

@@ -14,10 +14,7 @@ import com.qmrb.system.converter.BarnRecordConverter;
 import com.qmrb.system.mapper.BarnRecordMapper;
 import com.qmrb.system.mapper.CouponMapper;
 import com.qmrb.system.mq.PickCarProducer;
-import com.qmrb.system.pojo.entity.BarnRecord;
-import com.qmrb.system.pojo.entity.CarPark;
-import com.qmrb.system.pojo.entity.Coupon;
-import com.qmrb.system.pojo.entity.MyCarPlateNumber;
+import com.qmrb.system.pojo.entity.*;
 import com.qmrb.system.pojo.form.BarnRecordForm;
 import com.qmrb.system.pojo.query.BarnRecordQuery;
 import com.qmrb.system.pojo.vo.BarnRecordVO;
@@ -33,6 +30,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
@@ -136,6 +134,32 @@ public class BarnRecordServiceImpl extends ServiceImpl<BarnRecordMapper, BarnRec
                 Date billingStartTime = parkStoredCardService.getBillingStartTime(form);
                 record.setBillingStartTime(billingStartTime);
             }
+            // 将 Date 转换为 Instant
+            Instant instant = record.getInTime().toInstant();
+
+            // 将 Instant 转换为 LocalDateTime(假设使用系统默认时区)
+            LocalDateTime inDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
+            // 查询月卡,
+            List<CarParkStoredCard> storedCards = parkStoredCardService.list(new LambdaQueryWrapper<CarParkStoredCard>().eq(CarParkStoredCard::getPlateNumber, record.getCarNumber())
+                    .eq(CarParkStoredCard::getStatus,1).le(CarParkStoredCard::getStartTime, inDateTime)
+                    .orderByDesc(CarParkStoredCard::getEndTime));
+            if(CollectionUtil.isNotEmpty(storedCards)){
+                CarParkStoredCard storedCard = storedCards.get(0);
+                if(record.getOutTime() != null){
+                    // 将 Date 转换为 Instant
+                    Instant instant2 = record.getOutTime().toInstant();
+
+                    // 将 Instant 转换为 LocalDateTime(假设使用系统默认时区)
+                    LocalDateTime outDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
+                    if(outDateTime.isAfter(storedCard.getStartTime())){
+                        record.setCardEndTime(storedCard.getEndTime());
+                    }
+                }else if(record.getOutTime() == null && LocalDateTime.now().isAfter(storedCard.getStartTime())){
+                    record.setCardEndTime(storedCard.getEndTime());
+                }
+                
+            }
+            
             // 计算计费时长
             if (record.getOutTime() != null) {
                 record.setParkingTime(calculateTimeDifference(record.getBillingStartTime(), record.getOutTime()));
@@ -145,8 +169,10 @@ public class BarnRecordServiceImpl extends ServiceImpl<BarnRecordMapper, BarnRec
 
             if(queryParams.getIsMonthlyCardMode() != null){
                 record.setPendingAmount(carParkChargingRulesService.calcuExpenses(record.getId(),record.getCarNumber(),queryParams.getIsMonthlyCardMode()));
+                record.setPendingAmountWithCoupon(carParkChargingRulesService.calcuExpensesWithCoupon(record.getId(),record.getCarNumber(),queryParams.getIsMonthlyCardMode()));
             }else{
                 record.setPendingAmount(carParkChargingRulesService.calcuExpenses(record.getId(),record.getCarNumber(),false));
+                record.setPendingAmountWithCoupon(carParkChargingRulesService.calcuExpensesWithCoupon(record.getId(),record.getCarNumber(),false));
             }
             if(record.getReceivedAmount() == null){
                 record.setReceivedAmount(BigDecimal.ZERO);
@@ -156,6 +182,21 @@ public class BarnRecordServiceImpl extends ServiceImpl<BarnRecordMapper, BarnRec
             }else{
                 record.setBillingAmount(record.getReceivedAmount());
             }
+
+            // 查询优惠券
+            List<Coupon> coupons = couponMapper.selectList(new LambdaQueryWrapper<Coupon>().eq(Coupon::getGoodsId, record.getId()));
+            log.info("查询优惠券:{}",coupons.size());
+            if(CollectionUtil.isNotEmpty(coupons)){
+                Coupon coupon = coupons.get(0);
+                // 1 扫码抵用金额 2扫码抵用时长
+                if(1 == coupon.getCouponType()){
+                    record.setDiscountAmount(coupon.getDenomination());
+                }else if(2 == coupon.getCouponType()){
+                    record.setDiscountMinute(coupon.getDenomination());
+                }
+            }
+            
+            
             if(queryParams.getIsMonthlyCardMode() != null && queryParams.getIsMonthlyCardMode()){
                 if(record.getPendingAmount().compareTo(BigDecimal.ZERO) > 0){
                     barnRecords.add(record);
@@ -252,6 +293,7 @@ public class BarnRecordServiceImpl extends ServiceImpl<BarnRecordMapper, BarnRec
         }
         // 计费
         form.setPendingAmount(carParkChargingRulesService.calcuExpenses(form.getId(),form.getCarNumber(),isMonthlyCardMode));//待收金额
+        form.setPendingAmountWithCoupon(carParkChargingRulesService.calcuExpensesWithCoupon(form.getId(),form.getCarNumber(),isMonthlyCardMode));//待收金额
         if(form.getPendingAmount() != null){
             form.setPendingAmount(form.getPendingAmount());
             form.setBillingAmount(form.getReceivedAmount().add(form.getPendingAmount()));//计费金额

+ 93 - 10
src/main/java/com/qmrb/system/service/impl/CarParkChargingRulesServiceImpl.java

@@ -173,6 +173,99 @@ public class CarParkChargingRulesServiceImpl extends ServiceImpl<CarParkCharging
 		}
 		
 		parkingRecord.paidAmount = barnRecord.getReceivedAmount()!= null ? barnRecord.getReceivedAmount().doubleValue() : 0;;//已支付金额
+		
+		if(CollectionUtil.isNotEmpty(orderList)){
+			ArrayList<ParkingFeeCalculator.PaymentRecord> paymentRecords = new ArrayList<>();
+			for (Order order : orderList) {
+				ParkingFeeCalculator.PaymentRecord record = new ParkingFeeCalculator.PaymentRecord();
+				Instant payTimeInstant = order.getPayTime().toInstant();;
+				record.paymentTime = payTimeInstant.atZone(ZoneId.systemDefault()).toLocalDateTime();
+				record.amount = order.getAmountsPayable();
+				paymentRecords.add(record);
+			}
+			parkingRecord.paymentRecords = paymentRecords;
+		}
+		
+		double fee = 0;
+		if(CollectionUtil.isNotEmpty(list)){
+			CarParkStoredCard parkStoredCard = list.get(0);
+
+			parkingRecord.monthlyCardExpiryTime = parkStoredCard.getEndTime();
+
+			// 计算费用
+			fee = ParkingFeeCalculator.calculateParkingFee(parkingRecord, feeRule, isMonthlyCardMode);
+			// if(parkStoredCard.getStartTime().isAfter(inDateTime) && parkStoredCard.getEndTime().isBefore(LocalDateTime.now())){
+			// 	//入库时间在月卡开始日前,出库时间在结束日前  不会出现
+			// } else if(parkStoredCard.getStartTime().isAfter(inDateTime) && parkStoredCard.getEndTime().isAfter(LocalDateTime.now())){
+			// 	//入库时间在月卡开始日前,出库时间在结束日后  不会出现
+			// } else if (parkStoredCard.getStartTime().isBefore(inDateTime) && parkStoredCard.getEndTime().isBefore(LocalDateTime.now())) {
+			// 	//入库时间在月卡开始日后,出库时间在结束日前
+			// 	return BigDecimal.ZERO;
+			// } else if(parkStoredCard.getStartTime().isBefore(inDateTime) && parkStoredCard.getEndTime().isAfter(LocalDateTime.now())){
+			// 	//入库时间在月卡开始日后,出库时间在结束日后
+			// }
+		}else{
+			//直接计算费用
+			fee = ParkingFeeCalculator.calculateParkingFee(parkingRecord, feeRule, isMonthlyCardMode);
+		}
+		
+		return new BigDecimal(fee);
+	}
+	
+	/**
+	 * 根据停车记录计算费用
+	 * @param recordId
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public BigDecimal calcuExpensesWithCoupon(Long recordId, String carNumber,Boolean isMonthlyCardMode) {
+		// 查询当前用户是否有月卡
+		List<CarParkStoredCard> list = parkStoredCardService.list(new LambdaQueryWrapper<CarParkStoredCard>().eq(CarParkStoredCard::getPlateNumber, carNumber)
+				.eq(CarParkStoredCard::getStatus,1).orderByDesc(CarParkStoredCard::getEndTime));
+		BarnRecord barnRecord = barnRecordMapper.selectById(recordId);
+		Assert.isTrue(barnRecord != null, "计费时停车记录不存在,id为"+recordId);
+		
+		// 根据停车场id获取到计费规则
+		List<CarParkChargingRules> parkChargingRules = this.list(new LambdaQueryWrapper<CarParkChargingRules>().eq(CarParkChargingRules::getCarParkId, barnRecord.getCarParkId()));
+		Assert.isTrue(CollectionUtil.isNotEmpty(parkChargingRules), "计费规则不存在,停车场id为"+barnRecord.getCarParkId());
+		CarParkChargingRules carParkChargingRules = parkChargingRules.get(0);
+
+		// 获取所有订单
+		List<Order> orderList = orderMapper.selectList(new LambdaQueryWrapper<Order>().eq(Order::getGoodId, recordId).eq(Order::getPayStatus,1)); //查询已支付订单
+
+		
+		// 示例计费规则
+		ParkingFeeCalculator.FeeRule feeRule = new ParkingFeeCalculator.FeeRule();
+		feeRule.freeDurationMinutes = carParkChargingRules.getFreeTime();//免费时长
+		feeRule.firstCycleFee = carParkChargingRules.getFirstFee() != null ? carParkChargingRules.getFirstFee().doubleValue() : 0;//首周期计费金额
+		feeRule.firstCycleDurationMinutes = carParkChargingRules.getFirstCycle();//首周期计费时长
+		feeRule.cycleDurationMinutes = carParkChargingRules.getBillingCycle();//计费周期
+		feeRule.cycleFee = carParkChargingRules.getFee()!= null ? carParkChargingRules.getFee().doubleValue() : 0;//每周期计费金额
+		feeRule.dailyCapFee = carParkChargingRules.getFeeUpperLimit()!= null ? carParkChargingRules.getFeeUpperLimit().doubleValue() : 0;//24小时封顶费用
+		feeRule.gracePeriodMinutes = carParkChargingRules.getOutInterval();// 离场时长宽容度(分钟)
+
+
+		// 将 Date 转换为 Instant
+		Instant instant = barnRecord.getInTime().toInstant();
+
+		// 将 Instant 转换为 LocalDateTime(假设使用系统默认时区)
+		LocalDateTime inDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
+		
+		// 示例停车记录
+		ParkingFeeCalculator.ParkingRecord parkingRecord = new ParkingFeeCalculator.ParkingRecord();
+		parkingRecord.entryTime = inDateTime;
+		parkingRecord.exitTime = LocalDateTime.now();
+		if(barnRecord.getOutTime()!=null){
+			// 将 Date 转换为 Instant
+			Instant outInstant = barnRecord.getInTime().toInstant();
+
+			// 将 Instant 转换为 LocalDateTime(假设使用系统默认时区)
+			LocalDateTime outDateTime = outInstant.atZone(ZoneId.systemDefault()).toLocalDateTime();
+			parkingRecord.exitTime = outDateTime;
+		}
+		
+		parkingRecord.paidAmount = barnRecord.getReceivedAmount()!= null ? barnRecord.getReceivedAmount().doubleValue() : 0;;//已支付金额
 
 		
 		// 根据停车记录获取拥有的优惠券
@@ -215,16 +308,6 @@ public class CarParkChargingRulesServiceImpl extends ServiceImpl<CarParkCharging
 
 			// 计算费用
 			fee = ParkingFeeCalculator.calculateParkingFee(parkingRecord, feeRule, isMonthlyCardMode);
-			// if(parkStoredCard.getStartTime().isAfter(inDateTime) && parkStoredCard.getEndTime().isBefore(LocalDateTime.now())){
-			// 	//入库时间在月卡开始日前,出库时间在结束日前  不会出现
-			// } else if(parkStoredCard.getStartTime().isAfter(inDateTime) && parkStoredCard.getEndTime().isAfter(LocalDateTime.now())){
-			// 	//入库时间在月卡开始日前,出库时间在结束日后  不会出现
-			// } else if (parkStoredCard.getStartTime().isBefore(inDateTime) && parkStoredCard.getEndTime().isBefore(LocalDateTime.now())) {
-			// 	//入库时间在月卡开始日后,出库时间在结束日前
-			// 	return BigDecimal.ZERO;
-			// } else if(parkStoredCard.getStartTime().isBefore(inDateTime) && parkStoredCard.getEndTime().isAfter(LocalDateTime.now())){
-			// 	//入库时间在月卡开始日后,出库时间在结束日后
-			// }
 		}else{
 			//直接计算费用
 			fee = ParkingFeeCalculator.calculateParkingFee(parkingRecord, feeRule, isMonthlyCardMode);