longz
2026-07-24 5b23c1a87779c9e7f17d56a5566dba7eac46d81a
统计fix
8个文件已修改
204 ■■■■■ 已修改文件
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteImportExcelTest.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java
@@ -92,7 +92,8 @@
    private Integer supportOrder;
    @Excel(name = "*电费类型", width = 22, readConverterExp = "0=其他用电,1=商业用电,2=普通工业用电,3=大工业用电")
    private Integer electricityType;
    @Excel(name = "*报装类型", width = 20, readConverterExp = "1=独立报装,2=非独立报装")
    @Excel(name = "*报装类型", width = 20, readConverterExp = "1=独立报装,2=非独立报装",
            prompt = "填写:独立报装或非独立报装")
    private Integer businessExpandType;
    @Excel(name = "*报装电源容量", width = 20)
    private BigDecimal capacity;
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -311,7 +311,7 @@
        if (row.getRoundTheClock() == null) errors.add("7*24小时营业不能为空");
        if (row.getParkType() == null) errors.add("停车费类型不能为空");
        if (row.getElectricityType() == null) errors.add("电费类型不能为空");
        if (row.getBusinessExpandType() == null) errors.add("报装类型不能为空");
        if (row.getBusinessExpandType() == null) errors.add("报装类型不能为空或填写不正确,请填写独立报装或非独立报装");
        if (row.getCapacity() == null) errors.add("报装电源容量不能为空");
        if (row.getRatedPower() == null) errors.add("站点额定总功率不能为空");
        if (row.getPeriodFee() == null) errors.add("是否峰谷分时不能为空");
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteImportExcelTest.java
@@ -60,6 +60,8 @@
                    data.createCell(column).setCellValue("SITE-IMPORT-001");
                } else if ("*站点名称".equals(title)) {
                    data.createCell(column).setCellValue("站点导入测试");
                } else if ("*报装类型".equals(title)) {
                    data.createCell(column).setCellValue("独立报装");
                }
            }
            workbook.write(output);
@@ -73,6 +75,7 @@
        assertEquals(1, rows.size());
        assertEquals("SITE-IMPORT-001", rows.get(0).getCode());
        assertEquals("站点导入测试", rows.get(0).getName());
        assertEquals(1, rows.get(0).getBusinessExpandType());
    }
    @Test
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
@@ -96,6 +96,20 @@
        ChargingOrderTimeVO res = chargingOrderService.chargingList(dto);
        return AjaxResult.success(res);
    }
    @RequiresPermissions(value = {"/chargingPeriodStatistics"}, logical = Logical.OR)
    @PostMapping(value = "/chargingList/page")
    @ApiOperation(value = "充电时段统计分页列表", tags = {"管理后台-财务结算"})
    public AjaxResult<PageInfo<ChargingOrderListVO>> chargingListPage(@RequestBody ChargingListQuery dto) {
        return AjaxResult.success(chargingOrderService.chargingListPage(dto));
    }
    @RequiresPermissions(value = {"/chargingPeriodStatistics"}, logical = Logical.OR)
    @PostMapping(value = "/chargingList/summary")
    @ApiOperation(value = "充电时段统计汇总", tags = {"管理后台-财务结算"})
    public AjaxResult<ChargingOrderTimeVO> chargingListSummary(@RequestBody ChargingListQuery dto) {
        return AjaxResult.success(chargingOrderService.chargingListSummary(dto));
    }
    
    
    @RequiresPermissions(value = {"/chargingPeriodStatistics/order_info", "/chargingPeriodStatistics/charging_curve"}, logical = Logical.OR)
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -117,9 +117,8 @@
    List<Map<String, Object>> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    Map<String, Object> chargingListSum1(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    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);
    List<ChargingOrderListVO> chargingListNoPage( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -200,6 +200,10 @@
    ChargingOrderTimeVO chargingList(ChargingListQuery dto);
    PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto);
    ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto);
    List<ChargingOrderListVO> export(ChargingListQuery dto);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -3372,6 +3372,20 @@
    
    @Override
    public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
        return chargingPeriodStatistics(dto, true, true);
    }
    @Override
    public PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto) {
        return chargingPeriodStatistics(dto, true, false).getList();
    }
    @Override
    public ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto) {
        return chargingPeriodStatistics(dto, false, true);
    }
    private ChargingOrderTimeVO chargingPeriodStatistics(ChargingListQuery dto, boolean includeList, boolean includeSummary) {
        String startTime1 = null;
        String startTime2 = null;
        String endTime1 = null;
@@ -3455,9 +3469,10 @@
            }
        }
        dto.setSiteIds(siteIds);
        PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
        PageInfo<ChargingOrderListVO> pageInfo = null;
        List<ChargingOrderListVO> list = new ArrayList<>();
        if (includeList) {
            pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
        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);
@@ -3568,9 +3583,9 @@
            list.add(chargingOrderListVO);
        }
        fillChargingPeriodShareIncome(list);
        }
        if (includeSummary) {
        // 尖峰平谷充电到账
        BigDecimal jianElectronic = new BigDecimal("0");
        BigDecimal fengElectronic = new BigDecimal("0");
@@ -3586,51 +3601,40 @@
        BigDecimal feng = new BigDecimal("0");
        BigDecimal ping = new BigDecimal("0");
        BigDecimal gu = new BigDecimal("0");
        List<Map<String, Object>> list1 = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2);
        for (Map<String, Object> map : list1) {
            if(null == map){
                continue;
            }
            jianElectronic = jianElectronic.add(new BigDecimal(null == map.get("jianElectronic") ? "0" : map.get("jianElectronic").toString()));
            fengElectronic = fengElectronic.add(new BigDecimal(null == map.get("fengElectronic") ? "0" : map.get("fengElectronic").toString()));
            pingElectronic = pingElectronic.add(new BigDecimal(null == map.get("pingElectronic") ? "0" : map.get("pingElectronic").toString()));
            guElectronic = guElectronic.add(new BigDecimal(null == map.get("guElectronic") ? "0" : map.get("guElectronic").toString()));
            jianService = jianService.add(new BigDecimal(null == map.get("jianService") ? "0" : map.get("jianService").toString()));
            fengService = fengService.add(new BigDecimal(null == map.get("fengService") ? "0" : map.get("fengService").toString()));
            pingService = pingService.add(new BigDecimal(null == map.get("pingService") ? "0" : map.get("pingService").toString()));
            guService = guService.add(new BigDecimal(null == map.get("guService") ? "0" : map.get("guService").toString()));
            jian = jian.add(new BigDecimal(null == map.get("jian") ? "0" : map.get("jian").toString()));
            feng = feng.add(new BigDecimal(null == map.get("feng") ? "0" : map.get("feng").toString()));
            ping = ping.add(new BigDecimal(null == map.get("ping") ? "0" : map.get("ping").toString()));
            gu = gu.add(new BigDecimal(null == map.get("gu") ? "0" : map.get("gu").toString()));
        }
        Map<String, Object> map = this.baseMapper.chargingListSum1(dto, startTime1, startTime2, endTime1, endTime2);
        System.err.println("充电时段统计-查询参数:" + JSON.toJSONString(dto));
        System.err.println("充电时段统计-汇总数据:" + JSON.toJSONString(map));
        Map<String, Object> map = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2);
        if (map == null) {
            map = new HashMap<>();
        }
        jianElectronic = getSummaryDecimal(map, "jianElectronic");
        fengElectronic = getSummaryDecimal(map, "fengElectronic");
        pingElectronic = getSummaryDecimal(map, "pingElectronic");
        guElectronic = getSummaryDecimal(map, "guElectronic");
        jianService = getSummaryDecimal(map, "jianService");
        fengService = getSummaryDecimal(map, "fengService");
        pingService = getSummaryDecimal(map, "pingService");
        guService = getSummaryDecimal(map, "guService");
        jian = getSummaryDecimal(map, "jian");
        feng = getSummaryDecimal(map, "feng");
        ping = getSummaryDecimal(map, "ping");
        gu = getSummaryDecimal(map, "gu");
        //订单数量
        int orderCount = Integer.parseInt(String.valueOf(map.getOrDefault("orderCount", "0")));
        Integer summaryOrderCount = getNullableInteger(map, "orderCount");
        int orderCount = summaryOrderCount == null ? 0 : summaryOrderCount;
        // 计算充电总度数
        BigDecimal electronic = new BigDecimal(String.valueOf(map.getOrDefault("electronic", "0")));
        BigDecimal electronic = getSummaryDecimal(map, "electronic");
        // 支付金额
        BigDecimal paymentAmount = new BigDecimal(String.valueOf(map.getOrDefault("paymentAmount", "0")));
        BigDecimal paymentAmount = getSummaryDecimal(map, "paymentAmount");
        // 电费
        BigDecimal electrovalence = new BigDecimal(String.valueOf(map.getOrDefault("electrovalence", "0")));
        BigDecimal electrovalence = getSummaryDecimal(map, "electrovalence");
        // 服务费
        BigDecimal serviceCharge = new BigDecimal(String.valueOf(map.getOrDefault("serviceCharge", "0")));
        BigDecimal serviceCharge = getSummaryDecimal(map, "serviceCharge");
        chargingOrderTimeVO.setOrderCount(orderCount);
        chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        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));
        List<Long> summaryOrderIds = list1.stream()
                .filter(Objects::nonNull)
                .map(sumMap -> getSummaryLong(sumMap, "id"))
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        List<Long> summaryOrderIds = this.baseMapper.chargingListSummaryOrderIds(
                dto, startTime1, startTime2, endTime1, endTime2);
        Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
        chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
        chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
@@ -3673,8 +3677,11 @@
                    + "0" + "%/"
                    + "0" + "%");
        }
        pageInfo.setRecords(list);
        chargingOrderTimeVO.setList(pageInfo);
        }
        if (includeList) {
            pageInfo.setRecords(list);
            chargingOrderTimeVO.setList(pageInfo);
        }
        return chargingOrderTimeVO;
    }
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -430,21 +430,54 @@
                GROUP BY EXTRACT(MONTH FROM create_time)
            </when>
            <otherwise>
                SELECT EXTRACT(MONTH FROM billing_cycle) AS MONTH,
                       SUM(IFNULL(total_electricity_charge, 0)) AS electrovalence,
                       SUM(IFNULL(total_service_fee, 0) - IFNULL(tripartite_commission, 0)) AS service_charge
                FROM t_charging_settlement_bill
                WHERE statistical_date_type = 1 AND site_id != 0
                <if test="sixBefore != null">
                    AND billing_cycle &gt;= #{sixBefore}
                </if>
                <if test="siteIds != null and siteIds.size() > 0">
                    AND site_id IN
                    <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                        #{siteId}
                    </foreach>
                </if>
                GROUP BY EXTRACT(MONTH FROM billing_cycle)
                SELECT income.MONTH,
                       SUM(income.electrovalence) AS electrovalence,
                       SUM(income.service_charge) AS service_charge
                FROM (
                    SELECT EXTRACT(MONTH FROM billing_cycle) AS MONTH,
                           SUM(IFNULL(total_electricity_charge, 0)) AS electrovalence,
                           SUM(IFNULL(total_service_fee, 0) - IFNULL(tripartite_commission, 0)) AS service_charge
                    FROM t_charging_settlement_bill
                    WHERE statistical_date_type = 1
                      AND site_id != 0
                      AND billing_cycle &lt; DATE_FORMAT(CURDATE(), '%Y-%m-01')
                    <if test="sixBefore != null">
                        AND billing_cycle &gt;= #{sixBefore}
                    </if>
                    <if test="siteIds != null and siteIds.size() > 0">
                        AND site_id IN
                        <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                            #{siteId}
                        </foreach>
                    </if>
                    GROUP BY EXTRACT(MONTH FROM billing_cycle)
                    UNION ALL
                    SELECT EXTRACT(MONTH FROM charging_order.create_time) AS MONTH,
                           SUM(IFNULL(accounting.period_electric_price, 0)) AS electrovalence,
                           SUM(CASE
                                   WHEN charging_order.order_source = 2
                                       THEN IFNULL(accounting.period_service_price, 0) * 0.8
                                   ELSE IFNULL(accounting.period_service_price, 0)
                               END) AS service_charge
                    FROM t_charging_order_accounting_strategy accounting
                    INNER JOIN t_charging_order charging_order
                        ON accounting.charging_order_id = charging_order.id
                    WHERE charging_order.del_flag = 0
                      AND charging_order.status = 5
                      AND charging_order.recharge_payment_status = 2
                      AND charging_order.create_time &gt;= DATE_FORMAT(CURDATE(), '%Y-%m-01')
                      AND charging_order.create_time &lt; DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
                    <if test="siteIds != null and siteIds.size() > 0">
                        AND charging_order.site_id IN
                        <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                            #{siteId}
                        </foreach>
                    </if>
                    GROUP BY EXTRACT(MONTH FROM charging_order.create_time)
                ) income
                GROUP BY income.MONTH
            </otherwise>
        </choose>
    </select>
@@ -1283,9 +1316,7 @@
    <select id="chargingListSum" resultType="map">
        select
        a.id,
        a.siteId,
        a.order_source as orderSource,
        count(a.id) as orderCount,
        sum(a.charging_capacity) as electronic,
        sum(a.period_electric_price) as electrovalence,
        sum(CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END) as serviceCharge,
@@ -1305,7 +1336,7 @@
        from (
            select co.id, co.site_id as siteId, coas.type, coas.charging_capacity, coas.period_electric_price, coas.period_service_price, co.order_source
            from t_charging_order_accounting_strategy coas
            left join t_charging_order co on (coas.charging_order_id = co.id)
            inner join t_charging_order co on (coas.charging_order_id = co.id)
            where co.del_flag = 0 and co.recharge_payment_status = 2
            <if test="null != req.code and req.code!=''">
                and co.code LIKE CONCAT('%',#{req.code},'%')
@@ -1334,9 +1365,6 @@
            <if test="req.status != null ">
                and co.status = #{req.status}
            </if>
            <if test="req.status != null ">
                and co.status = #{req.status}
            </if>
            <if test="req.isWhitelist != null">
                and co.is_whitelist = #{req.isWhitelist}
            </if>
@@ -1350,21 +1378,12 @@
                and co.end_time between #{endTime1} and #{endTime2}
            </if>
            and co.start_time IS NOT NULL and co.end_time is not null
        ) as a group by a.id, a.siteId, a.order_source
        ) as a
    </select>
    <select id="chargingListSum1" resultType="map">
        select
        count(a.id) as orderCount,
        sum(a.charging_capacity) as electronic,
        sum(a.period_electric_price) as electrovalence,
        sum(CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END) as serviceCharge,
        sum(a.period_electric_price + (CASE WHEN a.order_source = 2 THEN a.period_service_price * 0.8 ELSE a.period_service_price END)) as paymentAmount
        from (
        select co.id,coas.charging_capacity, coas.period_electric_price, coas.period_service_price, co.order_source
        from t_charging_order_accounting_strategy coas
        left join t_charging_order co on (coas.charging_order_id = co.id)
    <select id="chargingListSummaryOrderIds" resultType="java.lang.Long">
        select co.id
        from t_charging_order co
        where co.del_flag = 0 and co.recharge_payment_status = 2
        <if test="null != req.code and req.code!=''">
            and co.code LIKE CONCAT('%',#{req.code},'%')
@@ -1406,7 +1425,6 @@
            and co.end_time between #{endTime1} and #{endTime2}
        </if>
        and co.start_time IS NOT NULL and co.end_time is not null
        ) as a
    </select>