diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 71ae21f4b..d29fef4e6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -64,6 +64,9 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { ProgramLogicFactory.register(MerchantDelayModeEnum.DELAY.getValue(), this); } + // 充满自停需要退款 + private final BigDecimal fullOfSelfStopping = new BigDecimal("5"); // 充满自停金额5元 + /** * 生成订单 * @@ -504,34 +507,64 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { logger.info("结算订单:{}, 是订单完成状态", orderBasicInfo.getOrderCode()); return; } + // 查询订单信息 + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode()); + // 订单消费金额, 除了充满自停是需要计算实际消费, 其他金额都是按次收费 + BigDecimal orderAmount; + if (fullOfSelfStopping.compareTo(orderBasicInfo.getPayAmount()) == 0) { + // 耗电量 + BigDecimal consumedEnergy = message.getConsumedEnergy(); + // 计费模板 + BigDecimal flatElectricityPrice = orderDetail.getFlatElectricityPrice(); // x元/每度 + BigDecimal flatServicePrice = orderDetail.getFlatServicePrice(); // x元/每度 + if (consumedEnergy == null || flatElectricityPrice == null) { + logger.info("计算电单车退款逻辑,耗电量或计费模板为空,不执行退款逻辑, orderCode:{}, 耗电量:{}, 每度电费:{}", orderBasicInfo.getOrderCode(), consumedEnergy, flatElectricityPrice); + return; + } + // 计算实际消费 + orderAmount = consumedEnergy.multiply(flatElectricityPrice); + } else { + // 其他金额都是按次收费, 不退款 + orderAmount = orderBasicInfo.getPayAmount(); + } + + // 退款金额 = 支付金额 - 优惠后总消费金额 + BigDecimal refundAmount = orderBasicInfo.getPayAmount().subtract(orderAmount).setScale(2, RoundingMode.DOWN); + + // 虚拟金额 指订单消费中不参与结算的部分 + BigDecimal virtualAmount = BigDecimal.ZERO; + if (OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue().equals(orderBasicInfo.getPayMode()) + || OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { + // 白名单支付所消费的金额,都属于虚拟金额,不参与结算对账 + virtualAmount = new BigDecimal(orderAmount.toString()); + } + + // 结算金额 = 消费金额 - 虚拟金额 - 优惠金额 + BigDecimal settleAmount = orderAmount.subtract(virtualAmount); // 订单状态 orderBasicInfo.setOrderStatus(OrderStatusEnum.ORDER_COMPLETE.getValue()); // 停止原因 orderBasicInfo.setReason(EBikeStopReasonEnum.getDescriptionByCode(message.getStopReason())); + orderBasicInfo.setRefundAmount(refundAmount); + orderBasicInfo.setOrderAmount(orderAmount); + orderBasicInfo.setVirtualAmount(virtualAmount); + orderBasicInfo.setSettleAmount(settleAmount); + orderBasicInfo.setDiscountAmount(BigDecimal.ZERO); + orderBasicInfo.setSettlementTime(DateUtils.getNowDate()); // 更新订单详情 - OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode()); if (orderDetail != null) { orderDetail.setTotalUsedElectricity(message.getConsumedEnergy()); orderDetail.setFlatUsedElectricity(message.getConsumedEnergy()); } - // 计算电单车退款金额 - calculateEBikeRefund(orderBasicInfo, orderDetail, message); - // 退款金额 - BigDecimal refundAmount = orderBasicInfo.getRefundAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getRefundAmount(); if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { // 订单退款, 退款金额大于0才退款 refundOrder(orderBasicInfo); } - // 结算金额 = 支付金额 - 退款金额 - BigDecimal settleAmount = orderBasicInfo.getPayAmount().subtract(refundAmount).setScale(2, RoundingMode.DOWN); - orderBasicInfo.setSettleAmount(settleAmount); - orderBasicInfo.setSettlementTime(DateUtils.getNowDate()); - // 更新数据库 OrderTransactionDTO dto = new OrderTransactionDTO(); dto.setOrderBasicInfo(orderBasicInfo); @@ -544,9 +577,6 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { * @param orderBasicInfo */ private void calculateEBikeRefund(OrderBasicInfo orderBasicInfo, OrderDetail orderDetail, EBikeMessageCmd03 message) { - // 充满自停需要退款 - BigDecimal fullOfSelfStopping = new BigDecimal("5"); // 充满自停金额5元 - // 退款金额 BigDecimal refundAmount = BigDecimal.ZERO; if (fullOfSelfStopping.compareTo(orderBasicInfo.getPayAmount()) == 0) {