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 >= #{startTime} AND charging_order.create_time < #{endTime} GROUP BY charging_order.site_id