longz
2026-08-04 129aa4718ca3d61d44fa1ec8051e0da002bcac83
fix: align large screen valid order count
3个文件已修改
38 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/LargeScreenStatJob.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -6856,6 +6856,7 @@
        }
        // 3. 全局注册用户数
        writeGlobal();
        clearLargeScreenCache();
        log.info("大屏预聚合表全量重建完成, 耗时 {}ms", System.currentTimeMillis() - start);
    }
@@ -6867,6 +6868,7 @@
        writeDaySlice(LocalDate.now());
        writeUserSitePairs(LocalDate.now(), LocalDate.now().plusDays(1));
        writeGlobal();
        clearLargeScreenCache();
        log.info("大屏预聚合表刷新完成, 耗时 {}ms", System.currentTimeMillis() - start);
    }
@@ -6897,7 +6899,7 @@
    /**
     * 写入一个月度切片聚合(M 行)
     * 金额/订单数取 monthSliceAgg(已结束+已支付口径);
     * 订单数取未删除、状态1-5口径;金额取已结束且已支付口径。
     * 充电用户数取 monthSliceUserAgg(工作台口径: 该站点所有订单的去重用户, 不区分状态/删除标记)
     */
    private void writeMonthSlice(LocalDate monthStart, LocalDate monthEnd) {
@@ -7026,6 +7028,13 @@
        return LARGE_SCREEN_CACHE_PREFIX + endpoint + ":" + idPart;
    }
    private void clearLargeScreenCache() {
        Collection<String> keys = redisService.keys(LARGE_SCREEN_CACHE_PREFIX + "*");
        if (keys != null && !keys.isEmpty()) {
            redisService.deleteObject(keys);
        }
    }
    private BigDecimal decimalValue(Map<String, Object> values, String key) {
        if (values == null) {
            return BigDecimal.ZERO;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/LargeScreenStatJob.java
@@ -65,7 +65,7 @@
        }
    }
    // 启动时表空则异步全量回填, 不阻塞启动
    // 启动时异步全量回填, 不阻塞启动。发布新的统计口径后需同步修正历史月份。
    @EventListener(ApplicationReadyEvent.class)
    public void backfillIfEmpty() {
        if (!TaskUtil.isScheduledTaskPort(port)) {
@@ -74,10 +74,7 @@
        try {
            Long count = chargingOrderMapper.statTableCount();
            Long userSiteCount = chargingOrderMapper.userSiteTableCount();
            if (count != null && count > 0 && userSiteCount != null && userSiteCount > 0) {
                return;
            }
            log.info("大屏预聚合表或用户-站点对表为空(stat={}, userSite={}), 启动异步全量回填", count, userSiteCount);
            log.info("大屏预聚合表启动异步全量回填(stat={}, userSite={})", count, userSiteCount);
            Thread backfill = new Thread(() -> {
                try {
                    chargingOrderService.rebuildLargeScreenStat();
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -3121,23 +3121,25 @@
    <!-- ==================== 大屏预聚合表 t_large_screen_site_stat ==================== -->
    <!-- 任务用: 按月切片聚合, 口径与 getLargeScreenSummary 完全一致(按月边界裁剪) -->
    <!-- 任务用: 按月切片聚合。订单数为未删除、状态1-5;金额和电量保持已结束且已支付口径。 -->
    <select id="monthSliceAgg" resultType="java.util.Map">
        SELECT charging_order.site_id AS site_id,
               COUNT(DISTINCT charging_order.id) AS order_count,
               COUNT(DISTINCT charging_order.app_user_id) AS user_count,
               COALESCE(ROUND(SUM(accounting.charging_capacity), 2), 0) AS capacity,
               COALESCE(ROUND(SUM(accounting.period_electric_price), 2), 0) AS electric_fee,
               COALESCE(ROUND(SUM(CASE
                   WHEN charging_order.order_source IN (0, 1) THEN accounting.period_service_price
                   ELSE accounting.period_service_price * 0.8
               END), 2), 0) AS service_fee
               COALESCE(ROUND(SUM(CASE WHEN charging_order.status = 5
                   AND charging_order.recharge_payment_status = 2 THEN accounting.charging_capacity ELSE 0 END), 2), 0) AS capacity,
               COALESCE(ROUND(SUM(CASE WHEN charging_order.status = 5
                   AND charging_order.recharge_payment_status = 2 THEN accounting.period_electric_price ELSE 0 END), 2), 0) AS electric_fee,
               COALESCE(ROUND(SUM(CASE WHEN charging_order.status = 5
                   AND charging_order.recharge_payment_status = 2 AND charging_order.order_source IN (0, 1) THEN accounting.period_service_price
                   WHEN charging_order.status = 5
                   AND charging_order.recharge_payment_status = 2 THEN accounting.period_service_price * 0.8
                   ELSE 0 END), 2), 0) AS service_fee
        FROM t_charging_order charging_order
        LEFT JOIN t_charging_order_accounting_strategy accounting
               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.status IN (1, 2, 3, 4, 5)
          AND charging_order.create_time &gt;= #{startTime}
          AND charging_order.create_time &lt; #{endTime}
        GROUP BY charging_order.site_id