From d039f7c8ce54963b3513293dc923771971f16a72 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期三, 29 四月 2026 19:47:40 +0800
Subject: [PATCH] feat:冒烟修改

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java       |  341 ++++++++++++++++++++-----
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java                   |    6 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java |    4 
 ruoyi-gateway/src/main/resources/logback.xml                                                              |    5 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java                 |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java                  |    6 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java    |   20 +
 ruoyi-service/ruoyi-integration/src/main/resources/logback.xml                                            |    5 
 ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml                                               |    5 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml                                           |    5 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java                |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java                          |   10 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java            |    7 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java               |   11 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java     |   58 ++++
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml                        |  212 ++++++++++++---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java                  |   10 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java          |   15 +
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java                       |    4 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java                       |   16 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java                |   19 -
 21 files changed, 613 insertions(+), 150 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java
index 1f22d37..cd6488f 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java
@@ -46,6 +46,14 @@
     @TableField("refund_amount")
     private BigDecimal refundAmount;
 
+    @ApiModelProperty(value = "本次余额退款金额")
+    @TableField("balance_refund_amount")
+    private BigDecimal balanceRefundAmount;
+
+    @ApiModelProperty(value = "本次第三方退款金额")
+    @TableField("third_refund_amount")
+    private BigDecimal thirdRefundAmount;
+
     @ApiModelProperty(value = "退款状态(1=退款中,2=退款成功)")
     @TableField("refund_status")
     private Integer refundStatus;
@@ -97,6 +105,9 @@
 
     @TableField(exist = false)
     private Integer type;
+    @ApiModelProperty(value = "充电支付模式:1=余额支付,2=余额组合支付,3=第三方支付")
+    @TableField(exist = false)
+    private Integer payMethod;
     @ApiModelProperty(value = "第三方支付流水号")
     @TableField(exist = false)
     private String serailNumber;
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java
index 523c6b6..c221c6c 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java
@@ -31,6 +31,8 @@
     private String endTime;
     @ApiModelProperty(value = "订单来源 1明星 2快电 3新电途")
     private Integer orderSource;
+    @ApiModelProperty(value = "支付方式筛选 1微信支付 2支付宝支付 3余额支付")
+    private Integer paymentType;
     @ApiModelProperty(value = "用户ids 前端忽略")
     private List<Long> userIds;
     @ApiModelProperty(value = "站点ids 前端忽略")
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java
new file mode 100644
index 0000000..157b640
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java
@@ -0,0 +1,20 @@
+package com.ruoyi.order.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "充电桩订单余额收入明细", description = "按兑换码卡包统计余额收入和赠送收入")
+public class ChargingOrderBalanceIncomeDetailVO {
+    @ApiModelProperty(value = "卡包ID")
+    private Long packageId;
+    @ApiModelProperty(value = "卡包名称")
+    private String packageName;
+    @ApiModelProperty(value = "余额收入")
+    private BigDecimal balanceIncome;
+    @ApiModelProperty(value = "赠送收入")
+    private BigDecimal giftIncome;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
index e63d3f6..c09eb32 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
@@ -18,6 +18,8 @@
     private Integer status;
     @ApiModelProperty(value = "充值支付方式(1=微信,2=支付宝)")
     private Integer rechargePaymentType;
+    @ApiModelProperty(value = "支付方式(1=余额支付,2=组合支付,3=第三方支付)")
+    private Integer payMethod;
     @ApiModelProperty(value = "充值支付状态(1=待支付,2=已支付)")
     private Integer rechargePaymentStatus;
     @ApiModelProperty(value = "电站id")
@@ -62,6 +64,10 @@
     private String phone;
     @ApiModelProperty(value = "充电到账金额")
     private BigDecimal paymentAmount;
+    @ApiModelProperty(value = "现金支付金额")
+    private BigDecimal thirdPayAmount;
+    @ApiModelProperty(value = "余额支付金额")
+    private BigDecimal balancePayAmount;
     @ApiModelProperty(value = "充电后剩余金额")
     private BigDecimal residualAmount;
     @ApiModelProperty(value = "累计电费")
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
index f1304f5..d4b79d0 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -23,6 +23,10 @@
     private Long chargingSecond;
     @ApiModelProperty(value = "平台手续费")
     private BigDecimal platFormMoney;
+    @ApiModelProperty(value = "余额收入")
+    private BigDecimal balanceIncome;
+    @ApiModelProperty(value = "赠送费用")
+    private BigDecimal balanceGiftIncome;
 
     @ApiModelProperty(value = "车牌号")
     private String licensePlate;
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java
index 5929188..df994ba 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java
@@ -22,4 +22,20 @@
     private BigDecimal electronicMoney;
     @ApiModelProperty(value = "服务费")
     private BigDecimal serviceMoney;
+    @ApiModelProperty(value = "平台收入汇总")
+    private BigDecimal platformIncomeTotal;
+    @ApiModelProperty(value = "合作商收入汇总")
+    private BigDecimal partnerIncomeTotal;
+    @ApiModelProperty(value = "微信收入")
+    private BigDecimal wechatIncome;
+    @ApiModelProperty(value = "支付宝收入")
+    private BigDecimal alipayIncome;
+    @ApiModelProperty(value = "余额收入")
+    private BigDecimal balanceIncome;
+    @ApiModelProperty(value = "余额赠送")
+    private BigDecimal balanceGiftIncome;
+    @ApiModelProperty(value = "白名单充电收入")
+    private BigDecimal whitelistChargingIncome;
+    @ApiModelProperty(value = "白名单退款")
+    private BigDecimal whitelistRefund;
 }
diff --git a/ruoyi-gateway/src/main/resources/logback.xml b/ruoyi-gateway/src/main/resources/logback.xml
index cae0868..f766a72 100644
--- a/ruoyi-gateway/src/main/resources/logback.xml
+++ b/ruoyi-gateway/src/main/resources/logback.xml
@@ -7,8 +7,9 @@
 	<contextName>logback</contextName>
 	
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/data/log/app/ruoyi-gateway"/>
-	
+<!--	<property name="log.path" value="/data/log/app/ruoyi-gateway"/>-->
+	<property name="log.path" value="/Users/mitao/Documents/log/mx_charging_pile/log/app/ruoyi-gateway"/>
+
 	<!--0. 日志格式和颜色渲染 -->
 	<!-- 彩色日志依赖的渲染类 -->
 	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index 779baa4..bcb5e3a 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -734,6 +734,13 @@
 
     }
 
+    @RequiresPermissions(value = {"/appUser/select", "/vipList/select"}, logical = Logical.OR)
+    @ApiOperation(value = "用户详情余额明细", tags = {"后台-用户管理-用户列表"})
+    @PostMapping(value = "/user/balance/page")
+    public R<Page<TExchangeCodeUseRecord>> adminBalanceDetail(@RequestBody ExchangeCodeUseRecordQuery queryDto) {
+        return otherClient.exchangeCodeUseRecordPage(queryDto);
+    }
+
     @ApiOperation(value = "余额明细", tags = {"小程序-个人中心"})
     @PostMapping(value = "/user/balance/page1")
     public R<Page<TExchangeCodeUseRecord>> balanceDetail(@RequestBody ExchangeCodeUseRecordQuery queryDto) {
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml
index 0460761..3865fab 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml
@@ -7,8 +7,9 @@
 	<contextName>logback</contextName>
 	
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/data/log/app/ruoyi-chargingPile"/>
-	
+<!--	<property name="log.path" value="/data/log/app/ruoyi-chargingPile"/>-->
+	<property name="log.path" value="/Users/mitao/Documents/log/mx_charging_pile/log/app/ruoyi-chargingPile"/>
+
 	<!--0. 日志格式和颜色渲染 -->
 	<!-- 彩色日志依赖的渲染类 -->
 	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
diff --git a/ruoyi-service/ruoyi-integration/src/main/resources/logback.xml b/ruoyi-service/ruoyi-integration/src/main/resources/logback.xml
index d2aaf1f..0d83de9 100644
--- a/ruoyi-service/ruoyi-integration/src/main/resources/logback.xml
+++ b/ruoyi-service/ruoyi-integration/src/main/resources/logback.xml
@@ -7,8 +7,9 @@
 	<contextName>logback</contextName>
 	
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/data/log/app/ruoyi-integration"/>
-	
+<!--	<property name="log.path" value="/data/log/app/ruoyi-integration"/>-->
+	<property name="log.path" value="/Users/mitao/Documents/log/mx_charging_pile/log/app/ruoyi-integration"/>
+
 	<!--0. 日志格式和颜色渲染 -->
 	<!-- 彩色日志依赖的渲染类 -->
 	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml b/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml
index 3ab2ecd..0a8e4b2 100644
--- a/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml
+++ b/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml
@@ -7,8 +7,9 @@
 	<contextName>logback</contextName>
 	
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/data/log/app/ruoyi-jianguan"/>
-	
+<!--	<property name="log.path" value="/data/log/app/ruoyi-jianguan"/>-->
+	<property name="log.path" value="/Users/mitao/Documents/log/mx_charging_pile/log/app/ruoyi-jianguan"/>
+
 	<!--0. 日志格式和颜色渲染 -->
 	<!-- 彩色日志依赖的渲染类 -->
 	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
index f76a621..6a706f7 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
@@ -172,6 +172,9 @@
                 }
 
             }
+            tChargingOrderExport.setPaymentMethod(getPaymentMethod(chargingOrderListVO));
+            tChargingOrderExport.setCashPayAmount(formatMoney(getCashPayAmount(chargingOrderListVO)));
+            tChargingOrderExport.setBalancePayAmount(formatMoney(getBalancePayAmount(chargingOrderListVO)));
             if (chargingOrderListVO.getCreateTime()!=null){
                 String s1 = DateUtils.localDateTimeToString(chargingOrderListVO.getCreateTime());
                 tChargingOrderExport.setCreateTime(s1);
@@ -218,7 +221,6 @@
             tChargingOrderExport.setServiceChargePrice("");
             tChargingOrderExport.setServiceChargePriceLook("");
             tChargingOrderExport.setCumulativeChargingTime(chargingOrderListVO.getChargingSecond() + "");
-            tChargingOrderExport.setRechargeAmount(chargingOrderListVO.getRechargeAmount().toString());
             tChargingOrderExport.setRefundAmount(null != chargingOrderListVO.getRefundAmount() ? chargingOrderListVO.getRefundAmount().toString() : "");
             tChargingOrderExport.setStartSoc(chargingOrderListVO.getStartSoc());
             tChargingOrderExport.setEndtSoc(chargingOrderListVO.getEndSoc());
@@ -283,6 +285,59 @@
                 e.printStackTrace();
             }
         }
+    }
+
+    private String getPaymentMethod(ChargingOrderListVO chargingOrderListVO) {
+        Integer payMethod = chargingOrderListVO.getPayMethod();
+        String thirdPayName = getThirdPayName(chargingOrderListVO.getRechargePaymentType());
+        if (Integer.valueOf(1).equals(payMethod)) {
+            return "余额支付";
+        }
+        if (Integer.valueOf(2).equals(payMethod)) {
+            return thirdPayName.isEmpty() ? "余额支付" : "余额支付+" + thirdPayName;
+        }
+        if (Integer.valueOf(3).equals(payMethod)) {
+            return thirdPayName;
+        }
+        return thirdPayName;
+    }
+
+    private String getThirdPayName(Integer rechargePaymentType) {
+        if (Integer.valueOf(1).equals(rechargePaymentType)) {
+            return "微信支付";
+        }
+        if (Integer.valueOf(2).equals(rechargePaymentType) || Integer.valueOf(3).equals(rechargePaymentType)) {
+            return "支付宝支付";
+        }
+        return "";
+    }
+
+    private BigDecimal getCashPayAmount(ChargingOrderListVO chargingOrderListVO) {
+        if (chargingOrderListVO.getThirdPayAmount() != null) {
+            return chargingOrderListVO.getThirdPayAmount();
+        }
+        if (Integer.valueOf(3).equals(chargingOrderListVO.getPayMethod())) {
+            return nullToZero(chargingOrderListVO.getPaymentAmount());
+        }
+        return BigDecimal.ZERO;
+    }
+
+    private BigDecimal getBalancePayAmount(ChargingOrderListVO chargingOrderListVO) {
+        if (chargingOrderListVO.getBalancePayAmount() != null) {
+            return chargingOrderListVO.getBalancePayAmount();
+        }
+        if (Integer.valueOf(1).equals(chargingOrderListVO.getPayMethod())) {
+            return nullToZero(chargingOrderListVO.getPaymentAmount());
+        }
+        return BigDecimal.ZERO;
+    }
+
+    private BigDecimal nullToZero(BigDecimal amount) {
+        return amount == null ? BigDecimal.ZERO : amount;
+    }
+
+    private String formatMoney(BigDecimal amount) {
+        return nullToZero(amount).setScale(2, RoundingMode.HALF_UP).toPlainString();
     }
     
     
@@ -356,4 +411,3 @@
     }
 
 }
-
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index 972893d..a8f1216 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -277,6 +277,11 @@
                 payOrderInfoDto.setRefundAmount(byId.getRefundAmount());
                 payOrderInfoDto.setRechargeAmount(byId.getRechargeAmount());
                 payOrderInfoDto.setFinalAmount(byId.getRechargeAmount().subtract(byId.getRefundAmount()));
+                payOrderInfoDto.setPayMethod(byId.getPayMethod());
+                payOrderInfoDto.setBalancePayAmount(byId.getBalancePayAmount());
+                payOrderInfoDto.setThirdPayAmount(byId.getThirdPayAmount());
+                payOrderInfoDto.setBalanceRefundAmount(byId.getBalanceRefundAmount());
+                payOrderInfoDto.setThirdRefundAmount(byId.getThirdRefundAmount());
                 return R.ok(payOrderInfoDto);
             case 2:
                 TShoppingOrder byId1 = shoppingOrderService.getById(orderId);
@@ -525,6 +530,16 @@
     }
 
 
+    @RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR)
+    @ResponseBody
+    @PostMapping(value = "/balanceIncomeDetail")
+    @ApiOperation(value = "充电桩订单余额收入明细", tags = {"管理后台-订单管理"})
+    public AjaxResult<List<ChargingOrderBalanceIncomeDetailVO>> balanceIncomeDetail(@RequestBody ChargingOrderQuery dto) {
+        List<ChargingOrderBalanceIncomeDetailVO> res = chargingOrderService.balanceIncomeDetail(dto);
+        return AjaxResult.success(res);
+    }
+
+
     @RequiresPermissions(value = {"/chargingPileOrder/monitoring_record"}, logical = Logical.OR)
     @ResponseBody
     @GetMapping(value = "/chargingOrderInfo")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java
index c776811..1eb02d8 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java
@@ -27,6 +27,16 @@
     private BigDecimal refundAmount;
     private BigDecimal rechargeAmount;
     private BigDecimal finalAmount;
+    @ApiModelProperty("充电支付模式:1=余额支付,2=余额组合支付,3=第三方支付")
+    private Integer payMethod;
+    @ApiModelProperty("余额支付金额")
+    private BigDecimal balancePayAmount;
+    @ApiModelProperty("第三方支付金额")
+    private BigDecimal thirdPayAmount;
+    @ApiModelProperty("余额退款金额")
+    private BigDecimal balanceRefundAmount;
+    @ApiModelProperty("第三方退款金额")
+    private BigDecimal thirdRefundAmount;
 
 
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java
index d17aada..c8188bb 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java
@@ -5,8 +5,6 @@
 import lombok.Data;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
-
 @Data
 @ApiModel(value = "充电时段统计-导出")
 public class TChargingOrderExport implements Serializable {
@@ -79,8 +77,12 @@
     private String serviceChargePriceLook;
     @Excel(name = "充电时长(分钟)",width = 30)
     private String cumulativeChargingTime;
-    @Excel(name = "充值金额",width = 30)
-    private String rechargeAmount;
+    @Excel(name = "支付方式",width = 30)
+    private String paymentMethod;
+    @Excel(name = "现金支付金额",width = 30)
+    private String cashPayAmount;
+    @Excel(name = "余额支付金额",width = 30)
+    private String balancePayAmount;
     @Excel(name = "退款金额",width = 30)
     private String refundAmount;
     @Excel(name = "充电前面soc",width = 30)
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
index 4084e22..b72e2a1 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -11,6 +11,7 @@
 import com.ruoyi.order.api.query.ChargingOrderQuery;
 import com.ruoyi.order.api.vo.ChargingOrderListVO;
 import com.ruoyi.order.api.vo.ChargingOrderVO;
+import com.ruoyi.order.api.vo.ChargingOrderBalanceIncomeDetailVO;
 import com.ruoyi.order.api.vo.TChargingOrderVo;
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.vo.OrderCountByDate;
@@ -59,6 +60,11 @@
 
     List<ChargingOrderVO> chargingOrder(@Param("pageInfo") PageInfo<ChargingOrderVO> pageInfo, @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
     Map<String, Object> chargingOrderNolimit( @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
+    Map<String, Object> chargingOrderFundSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
+    List<Long> chargingOrderSummaryOrderIds(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
+    Map<String, Object> exchangeCodeBalanceSummary(@Param("orderIds") List<Long> orderIds);
+    List<Map<String, Object>> exchangeCodeBalanceIncomeByOrderIds(@Param("orderIds") List<Long> orderIds);
+    List<ChargingOrderBalanceIncomeDetailVO> exchangeCodeBalanceIncomeDetail(@Param("orderIds") List<Long> orderIds);
 
     List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto);
 
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
index 9ed14ff..33c1691 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -144,6 +144,8 @@
 
 	TCharingOrderVO chargingOrder(ChargingOrderQuery dto);
 
+	List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto);
+
 	R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto);
 
     R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto);
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 5fc0df7..8dfdac4 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -474,6 +474,21 @@
         }
     }
 
+    private void finishManualChargingRefund(TChargingOrder chargingOrder, TChargingOrderRefund refund,
+                                            BigDecimal refundAmount, BigDecimal balanceRefundAmount, BigDecimal thirdRefundAmount) {
+        chargingOrder.setRefundStatus(2);
+        chargingOrder.setRefundAmount(money(chargingOrder.getRefundAmount()).add(refundAmount));
+        chargingOrder.setBalanceRefundAmount(money(chargingOrder.getBalanceRefundAmount()).add(balanceRefundAmount));
+        chargingOrder.setThirdRefundAmount(money(chargingOrder.getThirdRefundAmount()).add(thirdRefundAmount));
+        this.baseMapper.updateById(chargingOrder);
+        refund.setRefundStatus(2);
+        chargingOrderRefundService.save(refund);
+        if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
+            changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
+            recordBalanceRefund(chargingOrder, balanceRefundAmount, refund.getRefundCode());
+        }
+    }
+
 	@Override
 	public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
 		Long userId = tokenService.getLoginUserApplet().getUserId();
@@ -1163,6 +1178,8 @@
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                     chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
                     chargingOrderRefund.setRefundAmount(totalRefundAmount);
+                    chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+                    chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
                     chargingOrderRefund.setRefundStatus(1);
                     chargingOrderRefund.setPayType(rechargePaymentType);
                     chargingOrderRefund.setRefundStatus(1);
@@ -1190,7 +1207,6 @@
                         return;
                     }
                     this.updateById(chargingOrder);
-                    chargingOrderRefund.setRefundAmount(thirdRefundAmount);
                     if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                         WxPaymentRefundModel model = new WxPaymentRefundModel();
                         model.setOut_trade_no(chargingOrder.getCode());
@@ -1310,6 +1326,8 @@
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
 			chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
 			chargingOrderRefund.setRefundAmount(money);
+			chargingOrderRefund.setBalanceRefundAmount(BigDecimal.ZERO);
+			chargingOrderRefund.setThirdRefundAmount(money);
 			chargingOrderRefund.setRefundStatus(1);
 			chargingOrderRefund.setPayType(rechargePaymentType);
 			chargingOrderRefund.setRefundStatus(1);
@@ -1413,9 +1431,9 @@
                 one.setRefundTime(LocalDateTime.now());
                 chargingOrderRefundService.updateById(one);
 
-                if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) {
-                    changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount()));
-                    recordBalanceRefund(order, money(order.getBalanceRefundAmount()), one.getRefundCode());
+                if (money(one.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) {
+                    changeUserBalance(order.getAppUserId(), money(one.getBalanceRefundAmount()));
+                    recordBalanceRefund(order, money(one.getBalanceRefundAmount()), one.getRefundCode());
                 }
                 TChargingOrder chargingOrder = new TChargingOrder();
                 chargingOrder.setId(one.getChargingOrderId());
@@ -1741,39 +1759,11 @@
 		// 查询当前登陆人按钮权限
 		SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
 		Integer roleType = sysUser.getRoleType();
-		//如果没传siteId,获取当前登陆人所有的siteIds
-		List<Integer> siteIds = new ArrayList<>();
-		if (dto.getSiteId() == null) {
-			if (userId != null) {
-				List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
-				for (GetSiteListDTO datum : data) {
-					siteIds.add(datum.getId());
-				}
-			}
-		} else {
-			siteIds.add(dto.getSiteId());
-		}
-		if (siteIds.isEmpty()) {
-			siteIds.add(-1);
-		} else {
-			if (roleType == 2) {
-				List<Integer> integers = new ArrayList<>();
-				for (Integer siteId : siteIds) {
-					// 校验有没有这个站点的权限
-					List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
-					
-					Boolean b = t1.get(1);
-					if (b) {
-						integers.add(siteId);
-					}
-				}
-				siteIds = integers;
-			}
-		}
-		if (siteIds.isEmpty()) siteIds.add(-1);
-		dto.setSiteIds(siteIds);
-		List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
-		List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
+			setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
+			List<Integer> siteIds = dto.getSiteIds();
+			List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
+			fillChargingOrderBalanceIncome(list);
+			List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
 		for (ChargingOrderVO chargingOrderVO : list) {
 			if (roleType == 2) {
 				for (Integer siteId : siteIds) {
@@ -1837,25 +1827,226 @@
 				
 			}
 		}
+		fillEmptyChargingOrderSummary(tCharingOrderVO);
 		Map<String, Object> map = this.baseMapper.chargingOrderNolimit(dto, startTime1, startTime2, endTime1, endTime2);
 		if (null != map) {
-			tCharingOrderVO.setTotal(map.get("total") == null ? BigDecimal.ZERO : (BigDecimal) map.get("total"));
-			tCharingOrderVO.setTime(map.get("time") == null ? 0L : (Long) map.get("time"));
-			tCharingOrderVO.setIncome(map.get("income") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("income")).setScale(2, RoundingMode.HALF_EVEN));
-			tCharingOrderVO.setElectronicMoney(map.get("electronicMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("electronicMoney")).setScale(2, RoundingMode.HALF_EVEN));
-			tCharingOrderVO.setServiceMoney(map.get("serviceMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("serviceMoney")).setScale(2, RoundingMode.HALF_EVEN));
-		} else {
-			tCharingOrderVO.setTotal(BigDecimal.ZERO);
-			tCharingOrderVO.setTime(0L);
-			tCharingOrderVO.setIncome(BigDecimal.ZERO);
-			tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO);
-			tCharingOrderVO.setServiceMoney(BigDecimal.ZERO);
+			tCharingOrderVO.setTotal(getSummaryDecimal(map, "total"));
+			tCharingOrderVO.setTime(getSummaryLong(map, "time"));
+			tCharingOrderVO.setIncome(getSummaryDecimal(map, "income"));
+			tCharingOrderVO.setElectronicMoney(getSummaryDecimal(map, "electronicMoney"));
+			tCharingOrderVO.setServiceMoney(getSummaryDecimal(map, "serviceMoney"));
 		}
+		Map<String, Object> fundMap = this.baseMapper.chargingOrderFundSummary(dto, startTime1, startTime2, endTime1, endTime2);
+		if (null != fundMap) {
+			tCharingOrderVO.setPlatformIncomeTotal(getSummaryDecimal(fundMap, "platformIncomeTotal"));
+			tCharingOrderVO.setPartnerIncomeTotal(getSummaryDecimal(fundMap, "partnerIncomeTotal"));
+			tCharingOrderVO.setWechatIncome(getSummaryDecimal(fundMap, "wechatIncome"));
+			tCharingOrderVO.setAlipayIncome(getSummaryDecimal(fundMap, "alipayIncome"));
+			tCharingOrderVO.setWhitelistChargingIncome(getSummaryDecimal(fundMap, "whitelistChargingIncome"));
+			tCharingOrderVO.setWhitelistRefund(getSummaryDecimal(fundMap, "whitelistRefund"));
+		}
+		Map<String, Object> balanceMap = getExchangeCodeBalanceSummary(dto, startTime1, startTime2, endTime1, endTime2);
+		tCharingOrderVO.setBalanceIncome(getSummaryDecimal(balanceMap, "balanceIncome"));
+		tCharingOrderVO.setBalanceGiftIncome(getSummaryDecimal(balanceMap, "balanceGiftIncome"));
 		pageInfo.setRecords(list);
 		tCharingOrderVO.setList(pageInfo);
-		return tCharingOrderVO;
+			return tCharingOrderVO;
+		}
+
+		private void fillChargingOrderBalanceIncome(List<ChargingOrderVO> list) {
+			if (list == null || list.isEmpty()) {
+				return;
+			}
+			List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+			if (orderIds.isEmpty()) {
+				return;
+			}
+			Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+			List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
+			if (rows != null) {
+				for (Map<String, Object> row : rows) {
+					Long orderId = getSummaryLong(row, "orderId");
+					if (orderId != null) {
+						incomeMap.put(orderId, row);
+					}
+				}
+			}
+			for (ChargingOrderVO item : list) {
+				Map<String, Object> row = incomeMap.get(item.getId());
+				item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
+				item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
+			}
+		}
+		
+		private void setChargingOrderAuthSiteIds(ChargingOrderQuery dto, SysUser sysUser, Long userId, Integer roleType) {
+		List<Integer> siteIds = new ArrayList<>();
+		if (dto.getSiteId() == null) {
+			if (userId != null) {
+				List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+				for (GetSiteListDTO datum : data) {
+					siteIds.add(datum.getId());
+				}
+			}
+		} else {
+			siteIds.add(dto.getSiteId());
+		}
+		if (siteIds.isEmpty()) {
+			siteIds.add(-1);
+		} else if (roleType == 2) {
+			List<Integer> integers = new ArrayList<>();
+			for (Integer siteId : siteIds) {
+				List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
+				Boolean b = t1.get(1);
+				if (b) {
+					integers.add(siteId);
+				}
+			}
+			siteIds = integers;
+		}
+		if (siteIds.isEmpty()) {
+			siteIds.add(-1);
+		}
+		dto.setSiteIds(siteIds);
 	}
-	
+
+	@Override
+	public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) {
+		String startTime1 = null;
+		String startTime2 = null;
+		String endTime1 = null;
+		String endTime2 = null;
+		if (StringUtils.hasLength(dto.getStartTime())) {
+			String[] split = dto.getStartTime().split(" - ");
+			startTime1 = split[0];
+			startTime2 = split[1];
+		}
+		if (StringUtils.hasLength(dto.getEndTime())) {
+			String[] split = dto.getEndTime().split(" - ");
+			endTime1 = split[0];
+			endTime2 = split[1];
+		}
+		if (StringUtils.hasLength(dto.getPhone())) {
+			List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
+			if (data == null || data.isEmpty()) {
+				return new ArrayList<>();
+			}
+			dto.setUserIds(data);
+		}
+		Long userId = tokenService.getLoginUser().getUserid();
+		SysUser sysUser = sysUserClient.getSysUser(userId).getData();
+		setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
+		List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
+		if (orderIds == null || orderIds.isEmpty()) {
+			return new ArrayList<>();
+		}
+		Map<Long, ChargingOrderBalanceIncomeDetailVO> detailMap = new LinkedHashMap<>();
+		int batchSize = 500;
+		for (int i = 0; i < orderIds.size(); i += batchSize) {
+			List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+			List<ChargingOrderBalanceIncomeDetailVO> batchList = this.baseMapper.exchangeCodeBalanceIncomeDetail(batchIds);
+			if (batchList == null || batchList.isEmpty()) {
+				continue;
+			}
+			for (ChargingOrderBalanceIncomeDetailVO item : batchList) {
+				Long packageId = item.getPackageId() == null ? 0L : item.getPackageId();
+				ChargingOrderBalanceIncomeDetailVO detail = detailMap.get(packageId);
+				if (detail == null) {
+					detail = new ChargingOrderBalanceIncomeDetailVO();
+					detail.setPackageId(item.getPackageId());
+					detail.setPackageName(item.getPackageName());
+					detail.setBalanceIncome(BigDecimal.ZERO);
+					detail.setGiftIncome(BigDecimal.ZERO);
+					detailMap.put(packageId, detail);
+				}
+				detail.setBalanceIncome(detail.getBalanceIncome().add(item.getBalanceIncome() == null ? BigDecimal.ZERO : item.getBalanceIncome()));
+				detail.setGiftIncome(detail.getGiftIncome().add(item.getGiftIncome() == null ? BigDecimal.ZERO : item.getGiftIncome()));
+			}
+		}
+		List<ChargingOrderBalanceIncomeDetailVO> result = new ArrayList<>();
+		for (ChargingOrderBalanceIncomeDetailVO detail : detailMap.values()) {
+			BigDecimal balanceIncome = (detail.getBalanceIncome() == null ? BigDecimal.ZERO : detail.getBalanceIncome()).setScale(2, RoundingMode.HALF_EVEN);
+			BigDecimal giftIncome = (detail.getGiftIncome() == null ? BigDecimal.ZERO : detail.getGiftIncome()).setScale(2, RoundingMode.HALF_EVEN);
+			if (balanceIncome.compareTo(BigDecimal.ZERO) == 0 && giftIncome.compareTo(BigDecimal.ZERO) == 0) {
+				continue;
+			}
+			detail.setBalanceIncome(balanceIncome);
+			detail.setGiftIncome(giftIncome);
+			result.add(detail);
+		}
+		return result;
+	}
+
+	private void fillEmptyChargingOrderSummary(TCharingOrderVO tCharingOrderVO) {
+		tCharingOrderVO.setTotal(BigDecimal.ZERO);
+		tCharingOrderVO.setTime(0L);
+		tCharingOrderVO.setIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO);
+		tCharingOrderVO.setServiceMoney(BigDecimal.ZERO);
+		tCharingOrderVO.setPlatformIncomeTotal(BigDecimal.ZERO);
+		tCharingOrderVO.setPartnerIncomeTotal(BigDecimal.ZERO);
+		tCharingOrderVO.setWechatIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setAlipayIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setBalanceIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setBalanceGiftIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setWhitelistChargingIncome(BigDecimal.ZERO);
+		tCharingOrderVO.setWhitelistRefund(BigDecimal.ZERO);
+	}
+
+	private Map<String, Object> getExchangeCodeBalanceSummary(ChargingOrderQuery dto, String startTime1, String startTime2, String endTime1, String endTime2) {
+		Map<String, Object> totalMap = new HashMap<>();
+		totalMap.put("balanceIncome", BigDecimal.ZERO);
+		totalMap.put("balanceGiftIncome", BigDecimal.ZERO);
+		List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
+		if (orderIds == null || orderIds.isEmpty()) {
+			return totalMap;
+		}
+		BigDecimal balanceIncome = BigDecimal.ZERO;
+		BigDecimal balanceGiftIncome = BigDecimal.ZERO;
+		int batchSize = 500;
+		for (int i = 0; i < orderIds.size(); i += batchSize) {
+			List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+			Map<String, Object> batchMap = this.baseMapper.exchangeCodeBalanceSummary(batchIds);
+			if (batchMap != null) {
+				balanceIncome = balanceIncome.add(getSummaryDecimal(batchMap, "balanceIncome"));
+				balanceGiftIncome = balanceGiftIncome.add(getSummaryDecimal(batchMap, "balanceGiftIncome"));
+			}
+		}
+		totalMap.put("balanceIncome", balanceIncome);
+		totalMap.put("balanceGiftIncome", balanceGiftIncome);
+		return totalMap;
+	}
+
+		private BigDecimal getSummaryDecimal(Map<String, Object> map, String key) {
+			if (map == null) {
+				return BigDecimal.ZERO;
+			}
+			Object value = map.get(key);
+		if (value == null) {
+			return BigDecimal.ZERO;
+		}
+		if (value instanceof BigDecimal) {
+			return ((BigDecimal) value).setScale(2, RoundingMode.HALF_EVEN);
+		}
+		if (value instanceof Number) {
+			return BigDecimal.valueOf(((Number) value).doubleValue()).setScale(2, RoundingMode.HALF_EVEN);
+		}
+		return new BigDecimal(value.toString()).setScale(2, RoundingMode.HALF_EVEN);
+	}
+
+		private Long getSummaryLong(Map<String, Object> map, String key) {
+			if (map == null) {
+				return 0L;
+			}
+			Object value = map.get(key);
+		if (value == null) {
+			return 0L;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).longValue();
+		}
+		return Long.parseLong(value.toString());
+	}
+
 	@Override
 	public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) {
 		PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(), payOrderQueryDto.getPageSize());
@@ -2994,6 +3185,8 @@
                         SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                         chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                         chargingOrderRefund.setRefundAmount(refundAmount);
+                        chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+                        chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
                         chargingOrderRefund.setRefundStatus(2);
                         chargingOrderRefund.setPayType(rechargePaymentType);
                         chargingOrderRefund.setCode(chargingOrder.getCode());
@@ -3177,8 +3370,27 @@
 			chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
 			chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
 			chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
+			BigDecimal manualRefundAmount = money(payOrderQueryDto.getRefundAmount());
+			BigDecimal refundedThirdAmount = money(tChargingOrder.getThirdRefundAmount());
+			BigDecimal refundableThirdAmount = money(tChargingOrder.getThirdPayAmount()).subtract(refundedThirdAmount);
+			if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
+				refundableThirdAmount = BigDecimal.ZERO;
+			}
+			BigDecimal thirdRefundAmount = isBalancePayMode(tChargingOrder.getPayMethod())
+					? manualRefundAmount.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP)
+					: manualRefundAmount;
+			BigDecimal balanceRefundAmount = manualRefundAmount.subtract(thirdRefundAmount).setScale(2, RoundingMode.HALF_UP);
+			if (balanceRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
+				balanceRefundAmount = BigDecimal.ZERO;
+			}
+			chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+			chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
 			
-			if (1 == tChargingOrder.getRechargePaymentType()) {
+			if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+				chargingOrderRefund.setRefundSerialNumber("BALANCE");
+				finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
+			}
+			else if (1 == tChargingOrder.getRechargePaymentType()) {
 				WxPaymentRefundModel model = new WxPaymentRefundModel();
 				model.setOut_trade_no(tChargingOrder.getCode());
 				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -3186,16 +3398,13 @@
 				model.setReason("取消订单");
 				model.setNotify_url("/payment/wx/refund/notify");
 				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-				amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
-				amount.setTotal(tChargingOrder.getRechargeAmount().multiply(new BigDecimal(100)).intValue());
+				amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+				amount.setTotal((isBalancePayMode(tChargingOrder.getPayMethod()) ? money(tChargingOrder.getThirdPayAmount()) : money(tChargingOrder.getRechargeAmount())).multiply(new BigDecimal(100)).intValue());
 				amount.setCurrency("CNY");
 				model.setAmount(amount);
 				R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
 				if (200 == orderR.getCode()) {
-					tChargingOrder.setRefundStatus(2);
-					tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
-					this.baseMapper.updateById(tChargingOrder);
-					chargingOrderRefundService.save(chargingOrderRefund);
+					finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
 					//手续费
 					Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
 					Object refund_fee1 = amount1.get("refund_fee");
@@ -3205,33 +3414,27 @@
 				}
 			}
 			
-			if (2 == tChargingOrder.getRechargePaymentType()) {
+			else if (2 == tChargingOrder.getRechargePaymentType()) {
 				RefundReq dto = new RefundReq();
 				dto.setOutTradeNo(tChargingOrder.getCode());
 				dto.setOutRequestNo(tChargingOrder.getCode());
-				dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
+				dto.setRefundAmount(thirdRefundAmount.toString());
 				dto.setRefundReason("取消订单");
 				RefundResp resp = aliPaymentClient.refund(dto).getData();
 				if (null != resp) {
-					chargingOrderRefund.setRefundStatus(2);
-					chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
-					this.baseMapper.updateById(tChargingOrder);
-					chargingOrderRefundService.save(chargingOrderRefund);
+					finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
 					
 				}
 			}
-			if (3 == tChargingOrder.getRechargePaymentType()) {
+			else if (3 == tChargingOrder.getRechargePaymentType()) {
 				RefundReq dto = new RefundReq();
 				dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber());
 				dto.setOutRequestNo(tChargingOrder.getCode());
-				dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
+				dto.setRefundAmount(thirdRefundAmount.toString());
 				dto.setRefundReason("取消订单");
 				RefundResp resp = h5AliPaymentClient.refund(dto).getData();
 				if (null != resp && "10000".equals(resp.getCode())) {
-					chargingOrderRefund.setRefundStatus(2);
-					chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
-					this.baseMapper.updateById(tChargingOrder);
-					chargingOrderRefundService.save(chargingOrderRefund);
+					finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
 					
 				}
 			}
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
index 60fee7f..a4af1cc 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -118,6 +118,15 @@
         <if test="req.orderSource != null and req.orderSource == 3 ">
             and t1.tripartite_platform_name = 'XinDianTu'
         </if>
+        <if test="req.paymentType != null and req.paymentType == 1 ">
+            and t1.recharge_payment_type = 1
+        </if>
+        <if test="req.paymentType != null and req.paymentType == 2 ">
+            and t1.recharge_payment_type in (2, 3)
+        </if>
+        <if test="req.paymentType != null and req.paymentType == 3 ">
+            and t1.pay_method in (1, 2)
+        </if>
         <if test="req.siteId != null ">
             and t1.site_id = #{req.siteId}
         </if>
@@ -266,6 +275,8 @@
         re.refund_title,
         re.refund_reason,
         re.refund_amount,
+        re.balance_refund_amount,
+        re.third_refund_amount,
         re.refund_total_amount,
         re.refund_time,
         re.pay_type,
@@ -276,6 +287,7 @@
         co.create_time as pay_time,
         co.id as order_id,
         co.app_user_id as user_id,
+        co.pay_method as pay_method,
         1 as type
         FROM t_charging_order_refund re
         LEFT JOIN t_charging_order co ON re.charging_order_id = co.id
@@ -287,6 +299,8 @@
         re.refund_title,
         re.refund_reason,
         re.refund_amount,
+        0 as balance_refund_amount,
+        re.refund_amount as third_refund_amount,
         re.refund_total_amount,
         re.refund_time,
         re.pay_type,
@@ -297,6 +311,7 @@
         so.create_time as pay_time,
         so.id as order_id,
         so.app_user_id as user_id,
+        3 as pay_method,
         2 as type
         FROM t_shopping_order_refund re
         LEFT JOIN t_shopping_order so on re.shopping_order_id = so.id
@@ -308,6 +323,8 @@
         vr.refund_title,
         vr.refund_reason,
         vr.refund_amount,
+        0 as balance_refund_amount,
+        vr.refund_amount as third_refund_amount,
         vr.refund_total_amount,
         vr.refund_time,
         vr.pay_type,
@@ -318,6 +335,7 @@
         vo.create_time as pay_time,
         vo.id as order_id,
         vo.app_user_id as user_id,
+        3 as pay_method,
         3 as type
         FROM t_vip_order_refund vr
         LEFT JOIN t_vip_order vo on vr.vip_order_id = vo.id
@@ -992,6 +1010,7 @@
         b.`name` as siteName,
         a.`status`,
         a.recharge_payment_type as rechargePaymentType,
+        a.pay_method as payMethod,
         a.recharge_payment_status as rechargePaymentStatus,
         a.site_id as siteId,
         a.charging_pile_id as chargingPileId,
@@ -1014,6 +1033,8 @@
         c.license_plate as licensePlate,
         f.phone,
         a.payment_amount as paymentAmount,
+        a.third_pay_amount as thirdPayAmount,
+        a.balance_pay_amount as balancePayAmount,
         e.refund_amount as residualAmount,
         h.electrovalence as electrovalence,
         CASE WHEN a.order_source = 1 THEN h.serviceCharge ELSE h.serviceCharge * 0.8 END as serviceCharge,
@@ -1090,7 +1111,10 @@
         aa.electricity,
         aa.rechargeAmount,
         aa.rechargePaymentType,
+        aa.payMethod,
         aa.paymentAmount,
+        aa.thirdPayAmount,
+        aa.balancePayAmount,
         aa.electrovalence,
         aa.serviceCharge,
         aa.orderSource,
@@ -1121,7 +1145,10 @@
             b.electricity,
             b.recharge_amount as rechargeAmount,
             b.recharge_payment_type as rechargePaymentType,
+            b.pay_method as payMethod,
             b.payment_amount as paymentAmount,
+            b.third_pay_amount as thirdPayAmount,
+            b.balance_pay_amount as balancePayAmount,
             b.electrovalence,
             b.service_charge as serviceCharge,
             b.order_source as orderSource,
@@ -1189,8 +1216,8 @@
                 and b.end_time between #{endTime1} and #{endTime2}
             </if>
             and b.start_time IS NOT NULL and b.end_time is not null
-        ) as aa group by aa.id, aa.`code`, aa.siteId, aa.siteName, aa.orderType, aa.terminalName, aa.electricity, aa.rechargeAmount, aa.paymentAmount, aa.electrovalence, aa.serviceCharge, aa.tripartitePlatformName,
-        aa.startTime, aa.endTime, aa.chargingSecond, aa.startSoc, aa.endSoc, aa.`status`, aa.endMode, aa.phone, aa.licensePlate, aa.orderSource, aa.rechargePaymentType order by aa.startTime desc
+        ) as aa group by aa.id, aa.`code`, aa.siteId, aa.siteName, aa.orderType, aa.terminalName, aa.electricity, aa.rechargeAmount, aa.paymentAmount, aa.thirdPayAmount, aa.balancePayAmount, aa.electrovalence, aa.serviceCharge, aa.tripartitePlatformName,
+        aa.startTime, aa.endTime, aa.chargingSecond, aa.startSoc, aa.endSoc, aa.`status`, aa.endMode, aa.phone, aa.licensePlate, aa.orderSource, aa.rechargePaymentType, aa.payMethod order by aa.startTime desc
     </select>
 
 
@@ -2057,6 +2084,64 @@
     </select>
 
 
+    <sql id="ChargingOrderSummaryWhere">
+        where b.del_flag = 0 and b.recharge_payment_status = 2 and b.start_time IS NOT NULL and b.end_time is not null
+        <if test="null != req.code and req.code!=''">
+            and b.code LIKE CONCAT('%',#{req.code},'%')
+        </if>
+        <if test="null != req.userIds and req.userIds.size()>0">
+            and b.app_user_id in
+            <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != req.siteIds and req.siteIds.size()>0">
+            and b.site_id in
+            <foreach collection="req.siteIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="req.orderType != null ">
+            and b.order_type = #{req.orderType}
+        </if>
+        <if test="req.status != null ">
+            and b.status = #{req.status}
+        </if>
+        <if test="req.orderSource != null and req.orderSource == 1 ">
+            and (b.order_source = 0 or b.order_source = 1 )
+        </if>
+        <if test="req.orderSource != null and req.orderSource == 2 ">
+            and b.tripartite_platform_name = 'KuaiDian'
+        </if>
+        <if test="req.orderSource != null and req.orderSource == 3 ">
+            and b.tripartite_platform_name = 'XinDianTu'
+        </if>
+        <if test="req.paymentType != null and req.paymentType == 1 ">
+            and b.recharge_payment_type = 1
+        </if>
+        <if test="req.paymentType != null and req.paymentType == 2 ">
+            and b.recharge_payment_type in (2, 3)
+        </if>
+        <if test="req.paymentType != null and req.paymentType == 3 ">
+            and b.pay_method in (1, 2)
+        </if>
+        <if test="req.siteId != null ">
+            and b.site_id = #{req.siteId}
+        </if>
+        <if test="req.pileId != null ">
+            and b.charging_pile_id = #{req.pileId}
+        </if>
+        <if test="req.gunId != null ">
+            and b.charging_gun_id = #{req.gunId}
+        </if>
+        <if test="startTime1 != null and startTime1!=''">
+            and (b.pay_time between #{startTime1} and #{startTime2})
+        </if>
+        <if test="endTime1 != null and endTime1!=''">
+            and (b.end_time between #{endTime1} and #{endTime2})
+        </if>
+    </sql>
+
     <select id="chargingOrderNolimit" resultType="map">
         select
         sum(aa.time) as `time`,
@@ -2069,62 +2154,91 @@
             b.id,
             (UNIX_TIMESTAMP(b.end_time) - UNIX_TIMESTAMP(b.start_time)) as time,
             sum(a.charging_capacity) as total,
-            sum(a.period_electric_price) as  electronicMoney,
+            sum(a.period_electric_price) as electronicMoney,
             sum(CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END) as serviceMoney,
             sum(a.period_electric_price + (CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END)) as income
             from `charging_pile_order`.t_charging_order_accounting_strategy a
             left join `charging_pile_order`.t_charging_order b on (a.charging_order_id = b.id)
-            where b.del_flag = 0 and b.recharge_payment_status = 2 and b.start_time IS NOT NULL and b.end_time is not null
-            <if test="null != req.code and req.code!=''">
-                and b.code LIKE CONCAT('%',#{req.code},'%')
-            </if>
-            <if test="null != req.userIds and req.userIds.size()>0">
-                and b.app_user_id in
-                <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
-                    #{item}
-                </foreach>
-            </if>
-            <if test="null != req.siteIds and req.siteIds.size()>0">
-                and b.site_id in
-                <foreach collection="req.siteIds" item="item" index="index" separator="," open="(" close=")">
-                    #{item}
-                </foreach>
-            </if>
-            <if test="req.orderType != null ">
-                and b.order_type = #{req.orderType}
-            </if>
-            <if test="req.status != null ">
-                and b.status = #{req.status}
-            </if>
-            <if test="req.orderSource != null and req.orderSource == 1 ">
-                and (b.order_source = 0 or b.order_source = 1 )
-            </if>
-            <if test="req.orderSource != null and req.orderSource == 2 ">
-                and b.tripartite_platform_name = 'KuaiDian'
-            </if>
-            <if test="req.orderSource != null and req.orderSource == 3 ">
-                and b.tripartite_platform_name = 'XinDianTu'
-            </if>
-            <if test="req.siteId != null ">
-                and b.site_id = #{req.siteId}
-            </if>
-            <if test="req.pileId != null ">
-                and b.charging_pile_id = #{req.pileId}
-            </if>
-            <if test="req.gunId != null ">
-                and b.charging_gun_id = #{req.gunId}
-            </if>
-            <if test="startTime1 != null and startTime1!=''">
-                and (b.start_time between #{startTime1} and #{startTime2})
-            </if>
-            <if test="endTime1 != null and endTime1!=''">
-                and (b.end_time between #{endTime1} and #{endTime2})
-            </if>
+            <include refid="ChargingOrderSummaryWhere"/>
             group by b.id,time
         ) as aa
     </select>
 
+    <select id="chargingOrderFundSummary" resultType="map">
+        select
+        sum(CASE WHEN aa.recharge_payment_type = 1 and aa.thirdNetAmount > 0 THEN aa.thirdNetAmount ELSE 0 END) as wechatIncome,
+        sum(CASE WHEN aa.recharge_payment_type in (2, 3) and aa.thirdNetAmount > 0 THEN aa.thirdNetAmount ELSE 0 END) as alipayIncome,
+        0 as balanceIncome,
+        0 as platformIncomeTotal,
+        0 as partnerIncomeTotal,
+        0 as whitelistChargingIncome,
+        0 as whitelistRefund
+        from (
+            select
+            b.id,
+            b.recharge_payment_type,
+            IFNULL(b.third_pay_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.payment_amount, IFNULL(b.recharge_amount, 0)) ELSE 0 END) - IFNULL(b.third_refund_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.refund_amount, 0) ELSE 0 END) as thirdNetAmount
+            from `charging_pile_order`.t_charging_order b
+            <include refid="ChargingOrderSummaryWhere"/>
+        ) as aa
+    </select>
 
+    <select id="chargingOrderSummaryOrderIds" resultType="java.lang.Long">
+        select b.id
+        from `charging_pile_order`.t_charging_order b
+        <include refid="ChargingOrderSummaryWhere"/>
+    </select>
+
+    <select id="exchangeCodeBalanceSummary" resultType="map">
+        select
+        sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) WHEN change_type = 3 THEN -IFNULL(used_amount, 0) ELSE 0 END) as balanceIncome,
+        sum(CASE WHEN change_type = 2 THEN IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -IFNULL(gift_used_amount, 0) ELSE 0 END) as balanceGiftIncome
+        from `charging_pile_other`.t_exchange_code_use_record
+        where del_flag = 0 and change_type in (2, 3)
+        <if test="orderIds != null and orderIds.size()>0">
+            and order_id in
+            <foreach collection="orderIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="exchangeCodeBalanceIncomeByOrderIds" resultType="map">
+        select
+        order_id as orderId,
+        sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) WHEN change_type = 3 THEN -IFNULL(used_amount, 0) ELSE 0 END) as balanceIncome,
+        sum(CASE WHEN change_type = 2 THEN IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -IFNULL(gift_used_amount, 0) ELSE 0 END) as balanceGiftIncome
+        from `charging_pile_other`.t_exchange_code_use_record
+        where del_flag = 0 and order_id is not null and order_id != 0 and change_type in (2, 3)
+        <if test="orderIds != null and orderIds.size()>0">
+            and order_id in
+            <foreach collection="orderIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        group by order_id
+    </select>
+
+    <select id="exchangeCodeBalanceIncomeDetail" resultType="com.ruoyi.order.api.vo.ChargingOrderBalanceIncomeDetailVO">
+        select
+        p.id as packageId,
+        p.package_name as packageName,
+        sum(CASE WHEN r.change_type = 2 THEN IFNULL(r.used_amount, 0) WHEN r.change_type = 3 THEN -IFNULL(r.used_amount, 0) ELSE 0 END) as balanceIncome,
+        sum(CASE WHEN r.change_type = 2 THEN IFNULL(r.gift_used_amount, 0) WHEN r.change_type = 3 THEN -IFNULL(r.gift_used_amount, 0) ELSE 0 END) as giftIncome
+        from `charging_pile_other`.t_exchange_code_use_record r
+        left join `charging_pile_other`.t_exchange_code_detail d on r.detail_id = d.id
+        left join `charging_pile_other`.t_exchange_code_package p on d.package_id = p.id
+        where r.del_flag = 0 and r.change_type in (2, 3)
+        <if test="orderIds != null and orderIds.size()>0">
+            and r.order_id in
+            <foreach collection="orderIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        group by p.id, p.package_name
+        having balanceIncome != 0 or giftIncome != 0
+        order by p.id desc
+    </select>
 
 
     <select id="countOrdersByDate" resultType="com.ruoyi.order.vo.OrderCountByDate">
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
index 95f945d..53f27ff 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -496,7 +496,7 @@
         entity.setRemark(dto.getRemark());
         entity.setInventory(dto.getInventory());
         entity.setUnlimitedReceiveLimit(dto.getUnlimitedReceiveLimit());
-        entity.setReceiveLimit(Objects.equals(dto.getUnlimitedReceiveLimit(), 1) ? dto.getReceiveLimit() : null);
+        entity.setReceiveLimit(Objects.equals(dto.getUnlimitedReceiveLimit(), 1) ? null : dto.getReceiveLimit());
         entity.setFinanceReceivedAmount(defaultMoney(dto.getFinanceReceivedAmount()));
         entity.setGiftAmount(defaultMoney(dto.getGiftAmount()));
         entity.setTotalAmount(defaultMoney(dto.getTotalAmount()));
@@ -515,7 +515,7 @@
         if (dto.getExpireTime() != null && dto.getExpireTime().isBefore(LocalDateTime.now())) {
             throw new ServiceException("截止领取时间不能早于当前时间");
         }
-        if (Objects.equals(dto.getUnlimitedReceiveLimit(), 1)
+        if (!Objects.equals(dto.getUnlimitedReceiveLimit(), 1)
                 && (dto.getReceiveLimit() == null || dto.getReceiveLimit() <= 0)) {
             throw new ServiceException("请输入领取限制次数");
         }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java
index 062c7dc..e1e23f7 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java
@@ -6,7 +6,6 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 
 @Data
 @ApiModel("兑换码导出VO")
@@ -18,24 +17,12 @@
     @Excel(name = "密码", width = 20)
     private String password;
 
-    @Excel(name = "金额", width = 20)
+    @Excel(name = "金额(元)", width = 20)
     private BigDecimal amount;
 
-    @Excel(name = "数量", width = 15)
-    private Integer quantity;
-
-    @Excel(name = "状态", replace = {"未绑定_1", "已绑定_2", "已失效_3"}, width = 20)
+    @Excel(name = "绑定状态", replace = {"未绑定_1", "已绑定_2", "已失效_3"}, width = 20)
     private Integer status;
 
-    @Excel(name = "绑定手机号", width = 20)
+    @Excel(name = "绑定用户", width = 20)
     private String bindPhone;
-
-    @Excel(name = "绑定时间", exportFormat = "yyyy-MM-dd HH:mm:ss", width = 25)
-    private LocalDateTime bindTime;
-
-    @Excel(name = "失效时间", exportFormat = "yyyy-MM-dd HH:mm:ss", width = 25)
-    private LocalDateTime invalidTime;
-
-    @Excel(name = "失效原因", width = 25)
-    private String invalidReason;
 }

--
Gitblit v1.7.1