“mitao”
2026-04-29 d039f7c8ce54963b3513293dc923771971f16a72
feat:冒烟修改
1个文件已添加
20个文件已修改
763 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderRefund.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/logback.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/resources/logback.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ExchangeCodeDetailExportVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
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 前端忽略")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderBalanceIncomeDetailVO.java
New file
@@ -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;
}
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 = "累计电费")
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;
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;
}
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" />
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) {
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" />
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" />
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" />
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 @@
    }
}
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")
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;
}
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)
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);
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);
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);
                    
                }
            }
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">
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("请输入领取限制次数");
        }
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;
}