修改管理后台报表统计
1、修改管理后台充电订单统计
2、修改记录分账数据前先软删除之前的数据,然后根据实际支付金额(扣除退款)生成最新的分账记录
3个文件已修改
87 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -40,6 +40,7 @@
    
    /**
     * 获取小程序充电记录列表数据
     *
     * @param appUserId
     * @param type
     * @param pageCurr
@@ -52,6 +53,7 @@
    
    /**
     * 获取待开票订单列表
     *
     * @param month 筛选时间2024-01-01
     * @param pageCurr
     * @param pageSize
@@ -61,17 +63,27 @@
                                            @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
    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> chargingOrderBaseSummary(@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<Map<String, Object>> chargingOrderShareIncomeByOrderIds(@Param("orderIds") List<Long> orderIds);
    Map<String, Object> chargingOrderShareIncomeSummaryByOrderIds(@Param("orderIds") List<Long> orderIds);
    List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto);
    List<EnterpriseChargingAnalysisVO> enterpriseChargingAnalysis(@Param("pageInfo") PageInfo<EnterpriseChargingAnalysisVO> pageInfo,
                                                                  @Param("data") EnterpriseChargingAnalysisQuery query);
@@ -117,6 +129,7 @@
    BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds);
    Map<String, Object> countAll(@Param("siteIds")List<Integer> siteIds, @Param("partnerView") Boolean partnerView);
    List<Map<String, Object>> chargingOrderShareIncomeByPayChannel(@Param("sixBefore")LocalDate sixBefore,@Param("siteIds") List<Integer> siteIds);
    List<Map<String, Object>> getSumByType(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
@@ -132,11 +145,12 @@
    List<ChargingOrderListVO> chargingList(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<Map<String, Object>> chargingList1(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<Map<String, Object>> chargingListAccountingSummary(@Param("orderIds") List<Long> orderIds);
    Map<String, Object> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<Long> chargingListSummaryOrderIds(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
@@ -150,9 +164,11 @@
    List<Map<String, Object>> usersDay(@Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
    List<Map<String, Object>> usersDay1();
    List<Map<String, Object>> usersByQuery(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
    List<Map<String, Object>> usersByQuery1(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
    List<Map<String, Object>> getUserTagCount();
@@ -229,6 +245,7 @@
    
    /**
     * 获取启动失败且时间超过1小时的订单
     *
     * @return
     */
    List<TChargingOrder> findFailedStartupOrder();
@@ -236,6 +253,7 @@
    
    /**
     * 获取停止中的数据
     *
     * @return
     */
    List<TChargingOrder> findStoppedOrder();
@@ -243,6 +261,7 @@
    
    /**
     * 获取充电中的订单
     *
     * @return
     */
    List<TChargingOrder> findChargingOrder();
@@ -250,6 +269,7 @@
    /**
     * 获取已结束的数据
     *
     * @return
     */
    List<TChargingOrder> findEndChargingOrder();
@@ -257,6 +277,7 @@
    /**
     * 获取需要手动修改订单状态的数据
     *
     * @return
     */
    List<TChargingOrder> findUpStatusChargingOrder();
@@ -264,6 +285,7 @@
    /**
     * 查询充电算账单数据
     *
     * @param startTime
     * @param endTime
     */
@@ -277,6 +299,7 @@
    /**
     * 查询账户结算账单数据
     *
     * @param startTime
     * @param endTime
     */
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -773,6 +773,7 @@
                electrovalence,
                serviceCharge);
    }
    private TVip getVipSnapshot(TAppUserVipDetail vipDetail, Integer vipId) {
        if (vipDetail != null && StringUtils.hasLength(vipDetail.getVipJson())) {
            return JSON.parseObject(vipDetail.getVipJson(), TVip.class);
@@ -806,6 +807,7 @@
    boolean shouldConsumeVipDiscount(BigDecimal discountAmount) {
        return discountAmount != null && discountAmount.compareTo(BigDecimal.ZERO) > 0;
    }
    @Override
    public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
        Long userId = tokenService.getLoginUserApplet().getUserId();
@@ -3075,6 +3077,7 @@
        pageInfo.setRecords(list);
        return R.ok(pageInfo);
    }
    @Override
    public R<PageInfo<EnterpriseChargingAnalysisVO>> enterpriseChargingAnalysis(EnterpriseChargingAnalysisQuery query) {
        PageInfo<EnterpriseChargingAnalysisVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
@@ -5621,16 +5624,14 @@
            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                chargingOrderRefund.setRefundSerialNumber("BALANCE");
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            }
            else if (isIcbcOrder(tChargingOrder)) {
            } else if (isIcbcOrder(tChargingOrder)) {
                R shareRefund = refundIcbcShareBeforeMainRefund(tChargingOrder, chargingOrderRefund, thirdRefundAmount);
                if (shareRefund.getCode() != 200) {
                    return shareRefund;
                }
                refundByIcbcAndFinish(tChargingOrder, chargingOrderRefund, thirdRefundAmount, "取消订单", true,
                        manualRefundAmount, balanceRefundAmount);
            }
            else if (1 == tChargingOrder.getRechargePaymentType()) {
            } else if (1 == tChargingOrder.getRechargePaymentType()) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(tChargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -5655,9 +5656,7 @@
                    chargingOrderRefund.setRefundFee(refund_fee);
                    chargingOrderRefundService.updateById(chargingOrderRefund);
                }
            }
            else if (2 == tChargingOrder.getRechargePaymentType()) {
            } else if (2 == tChargingOrder.getRechargePaymentType()) {
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(tChargingOrder.getCode());
                dto.setOutRequestNo(tChargingOrder.getCode());
@@ -5670,8 +5669,7 @@
                            : firstNotBlank(resp == null ? null : resp.getMsg(), refundResult.getMsg(), "支付宝退款失败"));
                }
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            }
            else if (3 == tChargingOrder.getRechargePaymentType()) {
            } else if (3 == tChargingOrder.getRechargePaymentType()) {
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber());
                dto.setOutRequestNo(tChargingOrder.getCode());
@@ -5683,8 +5681,7 @@
                    return R.fail(refundResult == null ? "支付宝H5退款服务无响应" : firstNotBlank(refundResult.getMsg(), "支付宝H5退款失败"));
                }
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            }
            else {
            } else {
                return R.fail("不支持的退款支付方式");
            }
@@ -7242,6 +7239,7 @@
    /**
     * 获取已结束的数据
     *
     * @return
     */
    @Override
@@ -7251,6 +7249,7 @@
    /**
     * 获取需要手动修改订单状态的数据
     *
     * @return
     */
    @Override
@@ -7260,6 +7259,7 @@
    /**
     * 查询充电算账单数据
     *
     * @param startTime
     * @param endTime
     */
@@ -7271,6 +7271,7 @@
    /**
     * 查询账户结算账单数据
     *
     * @param startTime
     * @param endTime
     * @return
@@ -7283,6 +7284,7 @@
    /**
     * 手动处理退款数据
     *
     * @param refund_out_trade_no 退款商户单号
     */
    @Override
@@ -7364,6 +7366,7 @@
    /**
     * 手动添加完善订单费用明细
     *
     * @param orderId
     */
    @Override
@@ -7943,11 +7946,33 @@
        }
    }
    /**
     * 软删除旧的非成功/处理中的分账记录,为退款后重新计算分账做准备。
     * 仅删除 onlineShareStatus 不是 SUCCESS 或 PROCESSING 的记录,
     * 已成功线上分账的记录不可删除,避免重复分账。
     */
    private void softDeleteStaleChargingOrderShareRecords(TChargingOrder chargingOrder) {
        if (chargingOrder == null || !StringUtils.hasLength(chargingOrder.getCode())) {
            return;
        }
        LambdaUpdateWrapper<TChargingOrderShareRecord> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(TChargingOrderShareRecord::getChargingOrderCode, chargingOrder.getCode())
                .eq(TChargingOrderShareRecord::getDelFlag, false)
                .notIn(TChargingOrderShareRecord::getOnlineShareStatus, "SUCCESS", "PROCESSING")
                .set(TChargingOrderShareRecord::getDelFlag, true);
        int count = chargingOrderShareRecordMapper.update(null, wrapper);
        if (count > 0) {
            log.info("软删除充电订单旧分账记录,订单号:{},删除数量:{}", chargingOrder.getCode(), count);
        }
    }
    private void executeChargingOrderShare(TChargingOrder chargingOrder, Site site) {
        try {
            if (!isNeedChargingOrderShare(chargingOrder)) {
                return;
            }
            // 先软删除旧的非成功分账记录,再基于剩余支付金额重新计算
            softDeleteStaleChargingOrderShareRecords(chargingOrder);
            Partner partner = loadPartner(site);
            for (TChargingOrderShareRecord shareRecord : buildChargingOrderShareRecords(chargingOrder, site, partner)) {
                TChargingOrderShareRecord exist = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>()
@@ -7955,10 +7980,10 @@
                        .eq(TChargingOrderShareRecord::getPayChannel, shareRecord.getPayChannel())
                        .eq(TChargingOrderShareRecord::getDelFlag, false)
                        .last("limit 1"));
                if (exist != null && ("SUCCESS".equals(exist.getOnlineShareStatus()) || "PROCESSING".equals(exist.getOnlineShareStatus()))) {
                if (exist != null) {
                    // 已有成功/处理中的线上分账记录,跳过不重复处理
                    continue;
                }
                shareRecord = mergeChargingOrderShareRecord(exist, shareRecord);
                saveOrUpdateChargingOrderShareRecord(shareRecord);
                if (Boolean.TRUE.equals(shareRecord.getNeedOnlineShare())) {
                    processIcbcOnlineShare(shareRecord, partner);
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.order.mapper.TChargingOrderMapper">
@@ -2344,17 +2344,12 @@
            b.id,
            CASE WHEN count(a.id) > 0 THEN (UNIX_TIMESTAMP(MAX(b.end_time)) - UNIX_TIMESTAMP(MAX(b.start_time))) ELSE 0 END as time,
            sum(a.charging_capacity) as total,
            sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE a.period_electric_price END) as electronicMoney,
            sum(a.period_electric_price) as electronicMoney,
            sum(CASE
                    WHEN b.refund_status = 2 THEN 0
                    WHEN b.order_source = 1 THEN a.period_service_price
                    ELSE a.period_service_price * 0.8
                END) as serviceMoney,
            sum(CASE
                    WHEN b.refund_status = 2 THEN 0
                    ELSE a.period_electric_price
                        + CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END
                END) as income,
            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,
            MAX(b.recharge_payment_type) as recharge_payment_type,
            MAX(b.is_whitelist) as is_whitelist,
            MAX(b.electrovalence) as electrovalence,