diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index b2b1fc00d..8c1952a3b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -467,6 +467,7 @@ public abstract class AbstractProgramLogic implements InitializingBean { } /** + * 【公共方法】 returnUpdateOrderBasicInfo 与 returnUpdateOrderDetail 逻辑合并 * 更新订单主表和订单详情中的各种金额 * 只交易记录中的耗电量, 其他金额都以平台计算为主 * @param data 交易记录数据 @@ -481,7 +482,7 @@ public abstract class AbstractProgramLogic implements InitializingBean { // data中的消费金额 精确到小数点后四位,包含电费、 服务费 BigDecimal dataOrderAmount = new BigDecimal(data.getConsumptionAmount()).setScale(2, RoundingMode.HALF_UP); // data中的总用电量 - BigDecimal totalElectricity = new BigDecimal(StringUtils.isBlank(data.getTotalElectricity()) ? Constants.ZERO : data.getTotalElectricity()); + BigDecimal dataTotalElectricity = new BigDecimal(StringUtils.isBlank(data.getTotalElectricity()) ? Constants.ZERO : data.getTotalElectricity()); // 总电费金额 BigDecimal totalElectricityAmount = BigDecimal.ZERO; // 总服务费金额 @@ -587,8 +588,12 @@ public abstract class AbstractProgramLogic implements InitializingBean { // 平台计算的总消费金额 平台计算总电费金额 + 平台计算总服务费金额 BigDecimal computeTotalAmount = totalElectricityAmount.add(totalServiceAmount); - // 如果算出来的 电费金额 + 服务费金额 != 总消费金额,则电费金额等于总消费金额 - 服务费金额 - if (computeTotalAmount.compareTo(dataOrderAmount) != 0) { + /* + 如果算出来的 电费金额 + 服务费金额 != 总消费金额,并且尖峰平谷总用电量大于0, 则使用平台计算金额 + 例如: 尖峰平谷存在耗电量, 平台计算得出50元, 交易记录中传的总金额是60元, 则使用平台计算金额 + 尖峰平谷不存在耗电量, 平台计算得出0元, 交易记录中传的总金额是40元, 则使用交易记录中传的总金额(比如人工结算订单场景) + */ + if (computeTotalAmount.compareTo(dataOrderAmount) != 0 && (sumUsedElectricity.compareTo(BigDecimal.ZERO) > 0)) { // 2025年3月26日15点50分, 订单金额以平台计算为主,所以注释掉, 并打印日志说明 // totalElectricityAmount = dataOrderAmount.subtract(totalServiceAmount); logger.info("updateOrderBasicInfoAndOrderDetail平台计算出电费金额:{}, 服务费金额:{}, 汇总:{}, 交易记录传来的金额:{}", totalElectricityAmount, totalServiceAmount, computeTotalAmount, dataOrderAmount); @@ -644,7 +649,7 @@ public abstract class AbstractProgramLogic implements InitializingBean { orderDetail.setTotalElectricityAmount(totalElectricityAmount); // 电费总金额 orderDetail.setTotalServiceAmount(totalServiceAmount); // 服务费总金额 // sumUsedElectricity与totalElectricity对比, 取最大的值 - orderDetail.setTotalUsedElectricity(totalElectricity.max(sumUsedElectricity)); + orderDetail.setTotalUsedElectricity(dataTotalElectricity.max(sumUsedElectricity)); orderDetail.setTotalOrderAmount(dataOrderAmount); // 订单总金额 logger.info("end updateOrderBasicInfoAndOrderDetail:【{}】, 电费总金额:{}, 服务费总金额:{}, 总用电量:{}, 订单总金额:{}, 退款金额:{}, 虚拟金额:{}, 结算金额:{}", orderCode, totalElectricityAmount, totalServiceAmount, orderDetail.getTotalUsedElectricity(), dataOrderAmount, diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index ffaba7140..c4d6932f8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -371,6 +371,48 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { payOrderSuccessCallback(callbackDTO); } + public void settleOrderOld(TransactionRecordsData data, OrderBasicInfo orderBasicInfo) { + logger.info("【{}】-结算订单start data:{}, orderBasicInfo:{}", this.getClass().getSimpleName(), data.toString(), JSON.toJSONString(orderBasicInfo)); + // 判断订单状态 + if (StringUtils.equals(orderBasicInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())) { + logger.info("结算订单:{}, 是订单完成状态", orderBasicInfo.getOrderCode()); + return; + } + + // 获取更新数据后的orderBasicInfo对象 + returnUpdateOrderBasicInfo(orderBasicInfo, data); + + // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 + OrderDetail orderDetail = returnUpdateOrderDetail(orderBasicInfo, data); + + // 更新数据库 + OrderTransactionDTO dto = new OrderTransactionDTO(); + dto.setOrderBasicInfo(orderBasicInfo); + dto.setOrderDetail(orderDetail); + transactionService.doUpdateOrder(dto); + + // 订单退款 + refundOrder(orderBasicInfo); + + // 将卡/vin状态解锁 + if (!StringUtils.equals("0000000000000000", data.getLogicCard())) { + cardStatusUnlocked(orderBasicInfo.getLogicCard()); + } + + // 如果是vin启动,将启动锁定状态改为正常 + if (StringUtils.equals(data.getTransactionIdentifier(), "05")) { + vinStatusUnlocked(data.getVinCode()); + } + + // 发送停止充电订阅消息 + sendMsg(orderBasicInfo); + + // 从redis中取出实时记录保存到表中 + realTimeMonitorDataRedis2DB(orderBasicInfo.getTransactionCode(), orderBasicInfo.getOrderCode()); + + logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSON.toJSONString(dto)); + } + /** * 订单结算/结算订单逻辑/订单结算逻辑 * @param data @@ -386,10 +428,16 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { } // 获取更新数据后的orderBasicInfo对象 - returnUpdateOrderBasicInfo(orderBasicInfo, data); + // returnUpdateOrderBasicInfo(orderBasicInfo, data); // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 - OrderDetail orderDetail = returnUpdateOrderDetail(orderBasicInfo, data); + // OrderDetail orderDetail = returnUpdateOrderDetail(orderBasicInfo, data); + + // 查询订单详情 + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode()); + + // 计算订单各种金额 + updateOrderBasicInfoAndOrderDetail(data, orderBasicInfo, orderDetail); // 更新数据库 OrderTransactionDTO dto = new OrderTransactionDTO();