ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -984,7 +984,7 @@ @ResponseBody @GetMapping("/simulation/current") @ApiOperation(value = "查询当前枪可模拟结算的工行订单", tags = {"小程序-模拟充电"}) @ApiOperation(value = "查询当前枪可模拟结算的已支付订单", tags = {"小程序-模拟充电"}) public AjaxResult<ChargingSimulationVO> getCurrentSimulationOrder(@RequestParam("gunId") Integer gunId) { return AjaxResult.success(chargingOrderService.getCurrentSimulationOrder(gunId)); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java
@@ -1,10 +1,12 @@ package com.ruoyi.order.service.impl; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.vo.TransactionRecordMessageVO; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -16,6 +18,68 @@ private ChargingSimulationSupport() { } static BigDecimal availableAmount(TChargingOrder order) { if (order == null) { return BigDecimal.ZERO.setScale(2); } BigDecimal chargeAmount = money(order.getChargeAmount()); return chargeAmount.compareTo(BigDecimal.ZERO) > 0 ? chargeAmount : money(order.getRechargeAmount()); } static String paymentMode(TChargingOrder order) { if (order == null) { return "未知"; } if (Integer.valueOf(1).equals(order.getIsWhitelist()) && Integer.valueOf(1).equals(order.getWhitelistBenefitType())) { return "免支付"; } BigDecimal balanceAmount = money(order.getBalancePayAmount()); BigDecimal thirdAmount = thirdPayAmount(order); if (balanceAmount.compareTo(BigDecimal.ZERO) == 0 && thirdAmount.compareTo(BigDecimal.ZERO) == 0) { return "免支付"; } String thirdChannel = thirdChannel(order); if (balanceAmount.compareTo(BigDecimal.ZERO) > 0 && thirdAmount.compareTo(BigDecimal.ZERO) == 0) { return "余额支付"; } if (balanceAmount.compareTo(BigDecimal.ZERO) > 0 && thirdAmount.compareTo(BigDecimal.ZERO) > 0) { return "余额+" + thirdChannel; } return thirdChannel; } static BigDecimal thirdPayAmount(TChargingOrder order) { if (order == null) { return BigDecimal.ZERO.setScale(2); } BigDecimal thirdAmount = money(order.getThirdPayAmount()); if (thirdAmount.compareTo(BigDecimal.ZERO) > 0 || Integer.valueOf(1).equals(order.getPayMethod())) { return thirdAmount; } return money(order.getRechargeAmount()) .subtract(money(order.getBalancePayAmount())) .max(BigDecimal.ZERO) .setScale(2, RoundingMode.HALF_UP); } private static String thirdChannel(TChargingOrder order) { if ("ICBC".equalsIgnoreCase(order.getSourceName())) { return "工行支付"; } if (Integer.valueOf(2).equals(order.getRechargePaymentType())) { return "支付宝支付"; } if (Integer.valueOf(3).equals(order.getRechargePaymentType())) { return "支付宝H5支付"; } return "微信支付"; } private static BigDecimal money(BigDecimal amount) { return amount == null ? BigDecimal.ZERO.setScale(2) : amount.setScale(2, RoundingMode.HALF_UP); } static PreparedSimulation prepare(String orderCode, List<AccountingStrategyDetailOrder> tariffs, BigDecimal electricityFee, ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -274,7 +274,10 @@ Map<String, Object> map = new HashMap<>(); int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size(); map.put("number", size); query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); Integer pageCurr = query.getPageCurr() == null || query.getPageCurr() < 1 ? 1 : query.getPageCurr(); Integer pageSize = query.getPageSize() == null || query.getPageSize() < 1 ? 10 : query.getPageSize(); query.setPageCurr((pageCurr - 1) * pageSize); query.setPageSize(pageSize); List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize()); List<MyChargingOrderList> orderLists = new ArrayList<>(); for (TChargingOrder tChargingOrder : list) { @@ -282,16 +285,19 @@ myChargingOrderList.setId(tChargingOrder.getId().toString()); myChargingOrderList.setSiteId(tChargingOrder.getSiteId()); myChargingOrderList.setStatus(tChargingOrder.getStatus()); Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0); myChargingOrderList.setTitle(site.getName()); Site site = getOrderSite(tChargingOrder.getSiteId()); myChargingOrderList.setTitle(site == null ? "未知电站" : site.getName()); myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity()); String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData(); String name = getChargingGunName(tChargingOrder.getChargingGunId()); myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId()); myChargingOrderList.setName(name); myChargingOrderList.setEndMode(tChargingOrder.getEndMode()); BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); Integer status = tChargingOrder.getStatus(); BigDecimal payMoney = status != null && status < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); if (tChargingOrder.getCreateTime() != null) { myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } long count = orderEvaluateService.count(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderType, 1) .eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0)); myChargingOrderList.setEvaluate(count + 1L); @@ -301,6 +307,23 @@ map.put("list", orderLists); map.put("totle", list.size()); return map; } private Site getOrderSite(Integer siteId) { if (siteId == null) { return null; } R<List<Site>> result = siteClient.getSiteByIds(Collections.singletonList(siteId)); List<Site> sites = result == null ? Collections.emptyList() : result.getData(); return sites == null || sites.isEmpty() ? null : sites.get(0); } private String getChargingGunName(Integer chargingGunId) { if (chargingGunId == null) { return ""; } R<String> result = chargingGunClient.getAllName(chargingGunId); return result == null || result.getData() == null ? "" : result.getData(); } @@ -510,14 +533,7 @@ if (order == null || isWhitelistAllFreeOrder(order)) { return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); } BigDecimal thirdPayAmount = money(order.getThirdPayAmount()); if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) { return thirdPayAmount; } if (Integer.valueOf(3).equals(order.getPayMethod())) { return money(order.getRechargeAmount()); } return thirdPayAmount; return ChargingSimulationSupport.thirdPayAmount(order); } /** @@ -1019,8 +1035,7 @@ BigDecimal electricityFee = money(request.getElectricityFee()); BigDecimal serviceFee = money(request.getServiceFee()); BigDecimal simulationTotal = electricityFee.add(serviceFee).setScale(2, RoundingMode.HALF_UP); BigDecimal availableAmount = money(order.getChargeAmount()).compareTo(BigDecimal.ZERO) > 0 ? money(order.getChargeAmount()) : money(order.getRechargeAmount()); BigDecimal availableAmount = ChargingSimulationSupport.availableAmount(order); if (simulationTotal.compareTo(availableAmount) > 0) { throw new ServiceException("模拟消费金额不能超过订单可消费金额" + availableAmount.toPlainString() + "元"); } @@ -1060,7 +1075,6 @@ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>() .eq(TChargingOrder::getAppUserId, userId) .eq(TChargingOrder::getChargingGunId, gunId) .eq(TChargingOrder::getSourceName, "ICBC") .eq(TChargingOrder::getRechargePaymentStatus, 2) .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4)) .eq(TChargingOrder::getDelFlag, 0) @@ -1068,7 +1082,7 @@ .orderByDesc(TChargingOrder::getId) .last("limit 1")); if (order == null) { throw new ServiceException("当前枪没有属于你的可模拟ICBC已支付订单"); throw new ServiceException("当前枪没有属于你的可模拟已支付订单"); } return order; } @@ -1078,12 +1092,21 @@ result.setOrderId(order.getId()); result.setOrderCode(order.getCode()); result.setOrderStatus(order.getStatus()); result.setPaymentMode(ChargingSimulationSupport.paymentMode(order)); result.setPayMethod(order.getPayMethod()); result.setRechargePaymentType(order.getRechargePaymentType()); result.setSourceName(order.getSourceName()); result.setRechargeAmount(order.getRechargeAmount()); result.setChargeAmount(order.getChargeAmount()); result.setAvailableAmount(ChargingSimulationSupport.availableAmount(order)); result.setBalancePayAmount(order.getBalancePayAmount()); result.setThirdPayAmount(order.getThirdPayAmount()); result.setElectricityFee(order.getElectrovalence()); result.setServiceFee(order.getServiceCharge()); result.setPaymentAmount(order.getPaymentAmount()); result.setRefundAmount(order.getRefundAmount()); result.setBalanceRefundAmount(order.getBalanceRefundAmount()); result.setThirdRefundAmount(order.getThirdRefundAmount()); result.setRefundStatus(order.getRefundStatus()); result.setIcbcOrderId(order.getRechargeSerialNumber()); TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectOne( @@ -1093,6 +1116,14 @@ .eq(TChargingOrderShareRecord::getDelFlag, false) .orderByDesc(TChargingOrderShareRecord::getId) .last("limit 1")); if (shareRecord == null) { shareRecord = chargingOrderShareRecordMapper.selectOne( new LambdaQueryWrapper<TChargingOrderShareRecord>() .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId()) .eq(TChargingOrderShareRecord::getDelFlag, false) .orderByDesc(TChargingOrderShareRecord::getId) .last("limit 1")); } if (shareRecord != null) { result.setShareAmount(shareRecord.getShareAmount()); result.setShareStatus(shareRecord.getOnlineShareStatus()); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java
@@ -9,12 +9,21 @@ private Long orderId; private String orderCode; private Integer orderStatus; private String paymentMode; private Integer payMethod; private Integer rechargePaymentType; private String sourceName; private BigDecimal rechargeAmount; private BigDecimal chargeAmount; private BigDecimal availableAmount; private BigDecimal balancePayAmount; private BigDecimal thirdPayAmount; private BigDecimal electricityFee; private BigDecimal serviceFee; private BigDecimal paymentAmount; private BigDecimal refundAmount; private BigDecimal balanceRefundAmount; private BigDecimal thirdRefundAmount; private Integer refundStatus; private BigDecimal shareAmount; private String shareStatus; ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java
@@ -1,6 +1,7 @@ package com.ruoyi.order.service.impl; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.vo.TransactionRecordMessageVO; import org.junit.jupiter.api.Test; @@ -13,6 +14,57 @@ class ChargingSimulationSupportTest { @Test void supportsBalanceAndMixedPaymentAmounts() { TChargingOrder balance = new TChargingOrder(); balance.setPayMethod(1); balance.setRechargeAmount(new BigDecimal("10.00")); balance.setChargeAmount(new BigDecimal("10.00")); balance.setBalancePayAmount(new BigDecimal("10.00")); balance.setThirdPayAmount(BigDecimal.ZERO); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(balance)); assertEquals("余额支付", ChargingSimulationSupport.paymentMode(balance)); TChargingOrder mixed = new TChargingOrder(); mixed.setPayMethod(2); mixed.setRechargePaymentType(1); mixed.setSourceName("ICBC"); mixed.setRechargeAmount(new BigDecimal("10.00")); mixed.setBalancePayAmount(new BigDecimal("4.00")); mixed.setThirdPayAmount(new BigDecimal("6.00")); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(mixed)); assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(mixed)); TChargingOrder alipay = new TChargingOrder(); alipay.setPayMethod(3); alipay.setRechargePaymentType(2); alipay.setRechargeAmount(new BigDecimal("10.00")); alipay.setBalancePayAmount(BigDecimal.ZERO); alipay.setThirdPayAmount(new BigDecimal("10.00")); assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(alipay)); TChargingOrder legacyAlipay = new TChargingOrder(); legacyAlipay.setPayMethod(3); legacyAlipay.setRechargePaymentType(2); legacyAlipay.setRechargeAmount(new BigDecimal("10.00")); assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(legacyAlipay)); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.thirdPayAmount(legacyAlipay)); TChargingOrder legacyMixed = new TChargingOrder(); legacyMixed.setPayMethod(2); legacyMixed.setRechargePaymentType(1); legacyMixed.setSourceName("ICBC"); legacyMixed.setRechargeAmount(new BigDecimal("10.00")); legacyMixed.setBalancePayAmount(new BigDecimal("4.00")); assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(legacyMixed)); assertEquals(new BigDecimal("6.00"), ChargingSimulationSupport.thirdPayAmount(legacyMixed)); } @Test void buildsOneKwhRecordForSelectedTariffPeriod() { AccountingStrategyDetailOrder first = detail(1, 1, "00:00", "12:00"); AccountingStrategyDetailOrder second = detail(2, 3, "12:00", "23:59");