diff --git a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java index 49e9a30..3d13f79 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java @@ -4,15 +4,51 @@ import cn.dev33.satoken.stp.StpUtil; import com.cdzy.common.ex.EbikeException; import com.cdzy.common.model.dto.ResGPSDto; import com.cdzy.common.model.request.PageParam; -import com.cdzy.operations.enums.*; -import com.cdzy.operations.mapper.*; +import com.cdzy.operations.enums.BatteryStatus; +import com.cdzy.operations.enums.BikeOrderType; +import com.cdzy.operations.enums.BikeQrStatus; +import com.cdzy.operations.enums.BikeStatus; +import com.cdzy.operations.enums.BikeUsageStatus; +import com.cdzy.operations.enums.OrderDispatchState; +import com.cdzy.operations.enums.OrderHandleState; +import com.cdzy.operations.enums.RegionStatus; +import com.cdzy.operations.enums.SpecialBillingConfigurationType; +import com.cdzy.operations.mapper.EbiekSpecialDayMapper; +import com.cdzy.operations.mapper.EbiekSpecialTimeMapper; +import com.cdzy.operations.mapper.EbikeBatteryInfoMapper; +import com.cdzy.operations.mapper.EbikeBikeInfoMapper; +import com.cdzy.operations.mapper.EbikeBikeOrderMapper; +import com.cdzy.operations.mapper.EbikeBikeQrMapper; +import com.cdzy.operations.mapper.EbikeDefaultBillingConfigurationMapper; +import com.cdzy.operations.mapper.EbikeRegionMapper; +import com.cdzy.operations.mapper.EbikeSiteMapper; +import com.cdzy.operations.mapper.EbikeSpecialBillingConfigurationMapper; import com.cdzy.operations.model.dto.EbikeBikeInfoDto; import com.cdzy.operations.model.dto.EbikeDto; import com.cdzy.operations.model.dto.EbikeUserBikeInfo; import com.cdzy.operations.model.dto.EbikeUserLockDto; -import com.cdzy.operations.model.entity.*; -import com.cdzy.operations.model.vo.*; -import com.cdzy.operations.service.*; +import com.cdzy.operations.model.entity.EbikeBatteryInfo; +import com.cdzy.operations.model.entity.EbikeBikeInfo; +import com.cdzy.operations.model.entity.EbikeBikeOrder; +import com.cdzy.operations.model.entity.EbikeBikeQr; +import com.cdzy.operations.model.entity.EbikeDefaultBillingConfiguration; +import com.cdzy.operations.model.entity.EbikeDispatchConfiguration; +import com.cdzy.operations.model.entity.EbikeEcuInfo; +import com.cdzy.operations.model.entity.EbikeInventoryRecord; +import com.cdzy.operations.model.entity.EbikeRegion; +import com.cdzy.operations.model.entity.EbikeSpecialBillingConfiguration; +import com.cdzy.operations.model.entity.EbikeSpecialDay; +import com.cdzy.operations.model.entity.EbikeSpecialTime; +import com.cdzy.operations.model.vo.EbikeBatchLaunchVo; +import com.cdzy.operations.model.vo.EbikeBatchUnLaunchVo; +import com.cdzy.operations.model.vo.EbikeBikeBindVo; +import com.cdzy.operations.model.vo.EbikeBikeRadiusVo; +import com.cdzy.operations.model.vo.EbikeInventoryVo; +import com.cdzy.operations.service.EbikeBikeInfoService; +import com.cdzy.operations.service.EbikeDispatchConfigurationService; +import com.cdzy.operations.service.EbikeEcuInfoService; +import com.cdzy.operations.service.EbikeInventoryRecordService; +import com.cdzy.operations.service.EbikeInventoryService; import com.cdzy.operations.utils.RedisUtil; import com.ebike.feign.model.vo.EbikeLockVo; import com.mybatisflex.core.paginate.Page; @@ -365,6 +401,8 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl details = ebikeOrderDetailService.getOrderDetailsByOrderId(orderId); if (Objects.nonNull(details)) { @@ -340,27 +325,27 @@ public class EbikeOrderServiceImpl extends ServiceImpl { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setDurationFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserDurationFee((current != null ? current : BigDecimal.ZERO)); } case 2 -> { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setBaseFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserBaseFee((current != null ? current : BigDecimal.ZERO)); } case 3 -> { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setOutOfServiceAreaFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserDispatchFee((current != null ? current : BigDecimal.ZERO)); } case 4 -> { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setOutOfParkingAreaFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserDispatchFee((current != null ? current : BigDecimal.ZERO)); } case 5 -> { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setNoParkingZoneFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserDispatchFee((current != null ? current : BigDecimal.ZERO)); } case 6 -> { BigDecimal current = payDetailVo.getDetailAmount(); - ebikeOrderDetailVo.setHelmetManagementFee((current != null ? current : BigDecimal.ZERO)); + ebikeOrderDetailVo.setUserHelmetFee((current != null ? current : BigDecimal.ZERO)); } } } @@ -459,61 +444,68 @@ public class EbikeOrderServiceImpl extends ServiceImpl 停车区外 > 禁停区) + + // 4. 起步阶段:免费之后,但未超出起步时长 只收起步费 + long includedInBaseMinutes = freeDurationMinutes + baseDurationMinutes; + if (totalRideMinutes <= includedInBaseMinutes) { + dto.setBaseFee(baseFee); + dto.setTotalCost(baseFee); + return dto; + } + + // 5. 超出起步阶段:计算额外时长费用 + long extraMinutes = totalRideMinutes - includedInBaseMinutes; + long chargeUnits = (extraMinutes + chargeDurationMinutes - 1) / chargeDurationMinutes; + BigDecimal durationCost = durationFee.multiply(BigDecimal.valueOf(chargeUnits)); + + dto.setBaseFee(baseFee); + dto.setDurationFee(durationCost); + BigDecimal baseCost = baseFee.add(durationCost); + + // 6. 调度费用 BigDecimal additionalFee = BigDecimal.ZERO; if (data != null) { - // 运营区 if (Boolean.FALSE.equals(data.getBikeInRegion())) { - additionalFee = order.getOutOfServiceAreaFee() != null ? order.getOutOfServiceAreaFee() : BigDecimal.ZERO; - ebikeCostDetailDto.setOutOfServiceAreaFee(additionalFee); + additionalFee = Objects.requireNonNullElse(order.getOutOfServiceAreaFee(), BigDecimal.ZERO); + dto.setOutOfServiceAreaFee(additionalFee); } else if (Boolean.FALSE.equals(data.getBikeInParking())) { - // 不在运营区内但在停车区内 - additionalFee = order.getOutOfParkingAreaFee() != null ? order.getOutOfParkingAreaFee() : BigDecimal.ZERO; - ebikeCostDetailDto.setOutOfParkingAreaFee(additionalFee); - } else if (Boolean.FALSE.equals(data.getBikeInNoParking())) { - // 不在运营区内也不在停车区内,但在禁停区内 - additionalFee = order.getNoParkingZoneFee() != null ? order.getNoParkingZoneFee() : BigDecimal.ZERO; - ebikeCostDetailDto.setNoParkingZoneFee(additionalFee); + additionalFee = Objects.requireNonNullElse(order.getOutOfParkingAreaFee(), BigDecimal.ZERO); + dto.setOutOfParkingAreaFee(additionalFee); + } else if (Boolean.TRUE.equals(data.getBikeInNoParking())) { + additionalFee = Objects.requireNonNullElse(order.getNoParkingZoneFee(), BigDecimal.ZERO); + dto.setNoParkingZoneFee(additionalFee); } } - // 计算总费用 + + // 7. 总费用 + 封顶 BigDecimal totalCost = baseCost.add(additionalFee); - // 检查是否超过封顶金额 BigDecimal maxFee = order.getMaxFeeAmount(); if (maxFee != null && totalCost.compareTo(maxFee) > 0) { totalCost = maxFee; } - ebikeCostDetailDto.setTotalCost(totalCost); - return ebikeCostDetailDto; + dto.setTotalCost(totalCost); + return dto; } /**