longz
2026-07-15 a3657cc4e9fd9f13e4838db8eebaf914c529beee
结算的已支付订单
5个文件已修改
194 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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");