车辆计费规则保存

This commit is contained in:
yanglei 2025-12-26 15:51:11 +08:00
parent 74552ac204
commit 08416252f7

View File

@ -100,6 +100,14 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
.orderType(OrderType.ONCE)
.startLocation(orderDto.getStartPoint())
.startTime(LocalDateTime.now())
.baseFee(bikeInfo.getBaseFee())
.durationFee(bikeInfo.getDurationFee())
.freeDurationMinutes(bikeInfo.getFreeDurationMinutes())
.chargeDurationMinutes(bikeInfo.getChargeDurationMinutes())
.noParkingZoneFee(bikeInfo.getNoParkingZoneFee())
.outOfParkingAreaFee(bikeInfo.getOutOfParkingAreaFee())
.outOfServiceAreaFee(bikeInfo.getOutOfServiceAreaFee())
.maxFeeAmount(bikeInfo.getMaxFeeAmount())
.createTime(LocalDateTime.now())
.build();
save(order);
@ -201,19 +209,8 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
public Long doneRide(EbikeUserCyclingEndDto endDto) {
// 先校验是否有当前订单
EbikeOrder order = getOrder(endDto);
// 获取车辆信息,计算费用
EbikeBikeInfoVo bikeInfo = queryBikeInfo(endDto.getBikeCode());
order.setEndTime(LocalDateTime.now());
order.setEndLocation(endDto.getEndPoint());
order.setOperatorId(bikeInfo.getOperatorId());
order.setBaseFee(bikeInfo.getBaseFee());
order.setDurationFee(bikeInfo.getDurationFee());
order.setFreeDurationMinutes(bikeInfo.getFreeDurationMinutes());
order.setChargeDurationMinutes(bikeInfo.getChargeDurationMinutes());
order.setNoParkingZoneFee(bikeInfo.getNoParkingZoneFee());
order.setOutOfParkingAreaFee(bikeInfo.getOutOfParkingAreaFee());
order.setOutOfServiceAreaFee(bikeInfo.getOutOfServiceAreaFee());
order.setMaxFeeAmount(bikeInfo.getMaxFeeAmount());
// 关锁
EbikeLockVo ebikeLockVo = new EbikeLockVo();
ebikeLockVo.setBikeCode(endDto.getBikeCode());
@ -224,7 +221,7 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
}
FeignEbikeUserLockDto data = jsonResult.getData();
// 订单费用计算
BigDecimal totalAmount = costCalculation(order.getStartTime(), order.getEndTime(), bikeInfo, data);
BigDecimal totalAmount = costCalculation(order.getEndTime(), order, data);
// 费用为0不生成支付订单直接订单已支付返回订单id
if (totalAmount.compareTo(BigDecimal.ZERO) == 0) {
order.setPaymentTime(LocalDateTime.now());
@ -248,8 +245,8 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
.tradeId(StringUtils.generateLongSnowflakeId("tradeId"))
.currency("CNY")
.userId(endDto.getUserId())
.createBy(endDto.getUserId())
.operatorId(order.getOperatorId())
.createTime(LocalDateTime.now())
.tradeStatus(EbikePaymentTradeStatus.NO_PAYMENT)
.build();
ebikePaymentService.save(payment);
@ -384,21 +381,20 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
/**
* 计算订单费用
*
* @param startTime 订单开始时间
* @param endTime 订单结束时间
* @param bikeInfo 自行车详情
* @param order 自行车详情
* @param data 是否在停车区
* @return 订单费用
*/
private BigDecimal costCalculation(LocalDateTime startTime, LocalDateTime endTime,
EbikeBikeInfoVo bikeInfo, FeignEbikeUserLockDto data) {
private BigDecimal costCalculation(LocalDateTime endTime,
EbikeOrder order, FeignEbikeUserLockDto data) {
// 基础费用计算
BigDecimal baseFee = bikeInfo.getBaseFee();
BigDecimal durationFee = bikeInfo.getDurationFee();
Integer freeDurationMinutes = bikeInfo.getFreeDurationMinutes();
Integer chargeDurationMinutes = bikeInfo.getChargeDurationMinutes();
BigDecimal baseFee = Objects.requireNonNullElse(order.getBaseFee(), BigDecimal.ZERO);
BigDecimal durationFee = Objects.requireNonNullElse(order.getDurationFee(), BigDecimal.ZERO);
Integer freeDurationMinutes = order.getFreeDurationMinutes();
Integer chargeDurationMinutes = order.getChargeDurationMinutes();
// 获取总骑行时长
long totalRideSeconds = Duration.between(startTime, endTime).toSeconds();
long totalRideSeconds = Duration.between(order.getStartTime(), endTime).toSeconds();
// 免费时间
long freeDurationSeconds = freeDurationMinutes * GlobalConstants.LONG_SIXTY;
// 如果骑行时长小于等于免费时长,不收费
@ -419,19 +415,19 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
if (data != null) {
// 运营区
if (Boolean.FALSE.equals(data.getBikeInRegion())) {
additionalFee = bikeInfo.getOutOfServiceAreaFee() != null ? bikeInfo.getOutOfServiceAreaFee() : BigDecimal.ZERO;
additionalFee = order.getOutOfServiceAreaFee() != null ? order.getOutOfServiceAreaFee() : BigDecimal.ZERO;
} else if (Boolean.FALSE.equals(data.getBikeInParking())) {
// 不在运营区内但在停车区内
additionalFee = bikeInfo.getOutOfParkingAreaFee() != null ? bikeInfo.getOutOfParkingAreaFee() : BigDecimal.ZERO;
additionalFee = order.getOutOfParkingAreaFee() != null ? order.getOutOfParkingAreaFee() : BigDecimal.ZERO;
} else if (Boolean.FALSE.equals(data.getBikeInNoParking())) {
// 不在运营区内也不在停车区内但在禁停区内
additionalFee = bikeInfo.getNoParkingZoneFee() != null ? bikeInfo.getNoParkingZoneFee() : BigDecimal.ZERO;
additionalFee = order.getNoParkingZoneFee() != null ? order.getNoParkingZoneFee() : BigDecimal.ZERO;
}
}
// 计算总费用
BigDecimal totalCost = baseCost.add(additionalFee);
// 检查是否超过封顶金额
BigDecimal maxFee = bikeInfo.getMaxFeeAmount();
BigDecimal maxFee = order.getMaxFeeAmount();
if (maxFee != null && totalCost.compareTo(maxFee) > 0) {
totalCost = maxFee;
}