longz
2026-07-21 91379c1d07d3878840ea3d38b7c42d6d62ea75aa
充电时段统计fix
2个文件已修改
124 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -3371,7 +3371,6 @@
        PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
        List<ChargingOrderListVO> list = new ArrayList<>();
        Map<Integer, BigDecimal> siteServiceShareRatioMap = loadSiteServiceShareRatioMap();
        List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
        Map<Integer, Site> siteMap = loadChargingPeriodSites(maps);
        Map<Integer, TChargingPile> pileMap = loadChargingPeriodPiles(maps);
@@ -3426,7 +3425,6 @@
                chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
            }
            chargingOrderListVO.setElectrovalence(null == map.get("electrovalence") ? BigDecimal.ZERO : new BigDecimal(map.get("electrovalence").toString()));
            fillChargingPeriodIncome(chargingOrderListVO, siteServiceShareRatioMap);
            if(null != map.get("tripartitePlatformName")){
                chargingOrderListVO.setTripartitePlatformName(map.get("tripartitePlatformName").toString());
            }
@@ -3482,6 +3480,7 @@
            }
            list.add(chargingOrderListVO);
        }
        fillChargingPeriodShareIncome(list);
@@ -3539,23 +3538,15 @@
        chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        BigDecimal platformIncome = BigDecimal.ZERO;
        BigDecimal partnerIncome = BigDecimal.ZERO;
        for (Map<String, Object> sumMap : list1) {
            if (sumMap == null) {
                continue;
            }
            ChargingOrderListVO item = new ChargingOrderListVO();
            item.setSiteId(getSummaryLong(sumMap, "siteId").intValue());
            item.setOrderSource(getSummaryLong(sumMap, "orderSource").intValue());
            item.setPaymentAmount(getSummaryDecimal(sumMap, "paymentAmount"));
            item.setServiceCharge(getSummaryDecimal(sumMap, "serviceCharge"));
            fillChargingPeriodIncome(item, siteServiceShareRatioMap);
            platformIncome = platformIncome.add(nullToZero(item.getPlatformIncome()));
            partnerIncome = partnerIncome.add(nullToZero(item.getPartnerIncome()));
        }
        chargingOrderTimeVO.setPlatformIncome(platformIncome.setScale(2, RoundingMode.HALF_UP));
        chargingOrderTimeVO.setPartnerIncome(partnerIncome.setScale(2, RoundingMode.HALF_UP));
        List<Long> summaryOrderIds = list1.stream()
                .filter(Objects::nonNull)
                .map(sumMap -> getSummaryLong(sumMap, "id"))
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
        chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
        chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
        // 计算尖峰平谷充电到账占比
        BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
        // 计算尖峰平谷服务费占比
@@ -3752,78 +3743,45 @@
        dto.setSiteIds(siteIds);
        List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
        fillChargingPeriodExportBalanceIncome(list1);
        fillChargingPeriodIncome(list1);
        fillChargingPeriodShareIncome(list1);
        return list1;
    }
    private void fillChargingPeriodIncome(List<ChargingOrderListVO> list) {
    private void fillChargingPeriodShareIncome(List<ChargingOrderListVO> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        Map<Integer, BigDecimal> siteServiceShareRatioMap = loadSiteServiceShareRatioMap();
        List<Long> orderIds = list.stream()
                .map(ChargingOrderListVO::getId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
        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<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(batchIds);
            if (rows == null) {
                continue;
            }
            for (Map<String, Object> row : rows) {
                Long orderId = getSummaryLong(row, "orderId");
                if (orderId != null) {
                    incomeMap.put(orderId, row);
                }
            }
        }
        for (ChargingOrderListVO item : list) {
            fillChargingPeriodIncome(item, siteServiceShareRatioMap);
            applyChargingPeriodShareIncome(item, incomeMap.get(item.getId()));
        }
    }
    private void fillChargingPeriodIncome(ChargingOrderListVO item, Map<Integer, BigDecimal> siteServiceShareRatioMap) {
    void applyChargingPeriodShareIncome(ChargingOrderListVO item, Map<String, Object> row) {
        if (item == null) {
            return;
        }
        BigDecimal[] income = calculateChargingPeriodIncome(
                item.getPaymentAmount(),
                item.getServiceCharge(),
                siteServiceShareRatioMap.get(item.getSiteId()),
                item.getOrderSource());
        item.setPlatformIncome(income[0]);
        item.setPartnerIncome(income[1]);
    }
    static BigDecimal[] calculateChargingPeriodIncome(BigDecimal paymentAmount,
                                                    BigDecimal serviceCharge,
                                                    BigDecimal serviceShareRatio,
                                                    Integer orderSource) {
        BigDecimal paid = zeroIfNull(paymentAmount);
        BigDecimal partnerIncome = BigDecimal.ZERO;
        if (!Integer.valueOf(2).equals(orderSource)
                && serviceShareRatio != null
                && serviceShareRatio.compareTo(BigDecimal.ZERO) > 0) {
            partnerIncome = zeroIfNull(serviceCharge)
                    .multiply(serviceShareRatio)
                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
        }
        return new BigDecimal[]{
                paid.subtract(partnerIncome).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP),
                partnerIncome.setScale(2, RoundingMode.HALF_UP)
        };
    }
    private static BigDecimal zeroIfNull(BigDecimal amount) {
        return amount == null ? BigDecimal.ZERO : amount;
    }
    private Map<Integer, BigDecimal> loadSiteServiceShareRatioMap() {
        Map<Integer, BigDecimal> ratioMap = new HashMap<>();
        R<List<Site>> siteResult = siteClient.getSiteAll();
        R<List<Partner>> partnerResult = siteClient.getAllPartner();
        List<Site> sites = siteResult == null ? Collections.emptyList() : siteResult.getData();
        List<Partner> partners = partnerResult == null ? Collections.emptyList() : partnerResult.getData();
        if (sites == null || sites.isEmpty() || partners == null || partners.isEmpty()) {
            return ratioMap;
        }
        Map<Integer, Partner> partnerMap = partners.stream()
                .filter(partner -> partner != null && partner.getId() != null)
                .collect(Collectors.toMap(Partner::getId, partner -> partner, (left, right) -> left));
        for (Site site : sites) {
            if (site == null || site.getId() == null || site.getPartnerId() == null) {
                continue;
            }
            Partner partner = partnerMap.get(site.getPartnerId());
            if (partner != null && partner.getServiceShareRatio() != null) {
                ratioMap.put(site.getId(), partner.getServiceShareRatio());
            }
        }
        return ratioMap;
        item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
        item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
    }
    /**
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1211,12 +1211,12 @@
            and a.site_id = #{req.siteId}
        </if>
        <if test="startTime1 != null and startTime1!=''">
            and (a.create_time between #{startTime1} and #{startTime2})
            and (a.pay_time between #{startTime1} and #{startTime2})
        </if>
        <if test="endTime1 != null and endTime1!=''">
            and (a.end_time between #{endTime1} and #{endTime2})
        </if>
        and a.start_time IS NOT NULL order by a.create_time desc
        and a.start_time IS NOT NULL and a.end_time IS NOT NULL order by a.create_time desc
    </select>
@@ -1306,7 +1306,7 @@
            and b.site_id = #{req.siteId}
        </if>
        <if test="startTime1 != null and startTime1!=''">
            and b.start_time between #{startTime1} and #{startTime2}
            and b.pay_time between #{startTime1} and #{startTime2}
        </if>
        <if test="endTime1 != null and endTime2!=''">
            and b.end_time between #{endTime1} and #{endTime2}
@@ -1381,7 +1381,7 @@
                and co.site_id = #{req.siteId}
            </if>
            <if test="startTime1 != null and startTime1!=''">
                and co.start_time between #{startTime1} and #{startTime2}
                and co.pay_time between #{startTime1} and #{startTime2}
            </if>
            <if test="endTime1 != null and endTime2!=''">
                and co.end_time between #{endTime1} and #{endTime2}
@@ -1437,7 +1437,7 @@
            and co.site_id = #{req.siteId}
        </if>
        <if test="startTime1 != null and startTime1!=''">
            and co.start_time between #{startTime1} and #{startTime2}
            and co.pay_time between #{startTime1} and #{startTime2}
        </if>
        <if test="endTime1 != null and endTime2!=''">
            and co.end_time between #{endTime1} and #{endTime2}