diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/dal/mysql/statistics/OpsTrafficStatisticsMapper.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/dal/mysql/statistics/OpsTrafficStatisticsMapper.java index f238fbb..ca677e8 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/dal/mysql/statistics/OpsTrafficStatisticsMapper.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/dal/mysql/statistics/OpsTrafficStatisticsMapper.java @@ -31,6 +31,7 @@ public interface OpsTrafficStatisticsMapper extends BaseMapperX { */ List selectCreatedCountGroupByDate(@Param("orderType") String orderType, @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("tenantId") Long tenantId); /** * 按日期分组统计工单完成数 */ List selectCompletedCountGroupByDate(@Param("orderType") String orderType, @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("tenantId") Long tenantId); /** * 按日期分组统计平均响应时长和完成时长(秒) */ List selectAvgTimeGroupByDate(@Param("orderType") String orderType, @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("tenantId") Long tenantId); /** * 按区域分组统计工单数和完成数(非取消的工单) */ - List selectCountGroupByAreaId(@Param("orderType") String orderType); + List selectCountGroupByAreaId(@Param("orderType") String orderType, + @Param("tenantId") Long tenantId); /** * 按小时分组统计工单创建数 */ List selectCountGroupByHour(@Param("orderType") String orderType, @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("tenantId") Long tenantId); /** * 按星期和小时分组统计工单创建数(用于热力图) @@ -133,18 +138,21 @@ public interface OpsOrderMapper extends BaseMapperX { */ List selectCountGroupByDayOfWeekAndHour(@Param("orderType") String orderType, @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("tenantId") Long tenantId); /** * 按保洁类型分组统计平均作业时长(分钟) * JOIN ops_order_clean_ext,使用 arrived_time 和 completed_time 计算 */ - List selectAvgDurationGroupByCleaningType(@Param("orderType") String orderType); + List selectAvgDurationGroupByCleaningType(@Param("orderType") String orderType, + @Param("tenantId") Long tenantId); /** * 按功能类型分组统计工单数和完成数(非取消的工单) */ - List selectCountGroupByFunctionType(@Param("orderType") String orderType); + List selectCountGroupByFunctionType(@Param("orderType") String orderType, + @Param("tenantId") Long tenantId); // 注意:分页查询方法需要在Service层实现,这里只提供基础查询方法 // 具体分页查询请参考Service实现 diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/job/TrafficStatisticsCleanupJob.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/job/TrafficStatisticsCleanupJob.java index 4adb4ae..3d5caf7 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/job/TrafficStatisticsCleanupJob.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/job/TrafficStatisticsCleanupJob.java @@ -1,53 +1,55 @@ -package com.viewsh.module.ops.service.job; - -import com.viewsh.framework.tenant.core.util.TenantUtils; -import com.viewsh.module.ops.dal.mysql.statistics.OpsTrafficStatisticsMapper; -import com.xxl.job.core.handler.annotation.XxlJob; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; - -/** - * 客流统计清理任务 - *

- * 每月 1 日凌晨 2 点执行,删除 30 天前的客流统计记录 - * - * @author AI - */ -@Slf4j -@Component -public class TrafficStatisticsCleanupJob { - - @Resource - private OpsTrafficStatisticsMapper trafficStatisticsMapper; - - /** - * 清理过期的客流统计记录 - *

- * XxlJob 配置: - * - Cron: 0 0 2 1 * ? (每月 1 日凌晨 2 点) - * - * @return 执行结果 - */ - @XxlJob("trafficStatisticsCleanupJob") - public String execute() { - log.info("[TrafficStatisticsCleanupJob] 开始执行客流统计清理任务"); - - try { - LocalDateTime beforeTime = LocalDateTime.now().minusDays(30); - // 使用 executeIgnore 忽略租户过滤,清理所有租户的过期数据 - int deletedCount = TenantUtils.executeIgnore( - () -> trafficStatisticsMapper.deleteByStatHourBefore(beforeTime)); - - log.info("[TrafficStatisticsCleanupJob] 客流统计清理完成:删除 {} 条记录(截止时间={})", - deletedCount, beforeTime); - return "清理完成:删除 " + deletedCount + " 条记录"; - - } catch (Exception e) { - log.error("[TrafficStatisticsCleanupJob] 客流统计清理失败", e); - return "清理失败: " + e.getMessage(); - } - } -} +package com.viewsh.module.ops.service.job; + +import com.viewsh.framework.tenant.core.context.TenantContextHolder; +import com.viewsh.framework.tenant.core.job.TenantJob; +import com.viewsh.module.ops.dal.mysql.statistics.OpsTrafficStatisticsMapper; +import com.xxl.job.core.handler.annotation.XxlJob; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * 客流统计清理任务 + *

+ * 每月 1 日凌晨 2 点执行,删除 30 天前的客流统计记录。 + * 使用 @TenantJob 遍历每个租户逐个清理,确保租户隔离。 + * + * @author AI + */ +@Slf4j +@Component +public class TrafficStatisticsCleanupJob { + + @Resource + private OpsTrafficStatisticsMapper trafficStatisticsMapper; + + /** + * 清理过期的客流统计记录 + *

+ * XxlJob 配置: + * - Cron: 0 0 2 1 * ? (每月 1 日凌晨 2 点) + * + * @return 执行结果 + */ + @XxlJob("trafficStatisticsCleanupJob") + @TenantJob + public String execute() { + Long tenantId = TenantContextHolder.getRequiredTenantId(); + log.info("[TrafficStatisticsCleanupJob] 开始执行客流统计清理任务, tenantId={}", tenantId); + + try { + LocalDateTime beforeTime = LocalDateTime.now().minusDays(30); + int deletedCount = trafficStatisticsMapper.deleteByStatHourBefore(beforeTime, tenantId); + + log.info("[TrafficStatisticsCleanupJob] 客流统计清理完成:tenantId={}, 删除 {} 条记录(截止时间={})", + tenantId, deletedCount, beforeTime); + return "清理完成:删除 " + deletedCount + " 条记录"; + + } catch (Exception e) { + log.error("[TrafficStatisticsCleanupJob] 客流统计清理失败, tenantId={}", tenantId, e); + return "清理失败: " + e.getMessage(); + } + } +} diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/statistics/OpsStatisticsServiceImpl.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/statistics/OpsStatisticsServiceImpl.java index 31ac0bf..37ba984 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/statistics/OpsStatisticsServiceImpl.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/statistics/OpsStatisticsServiceImpl.java @@ -2,6 +2,7 @@ package com.viewsh.module.ops.service.statistics; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.viewsh.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.viewsh.framework.tenant.core.context.TenantContextHolder; import com.viewsh.module.ops.controller.admin.workorder.vo.statistics.*; import com.viewsh.module.ops.controller.admin.workorder.vo.statistics.DashboardStatsRespVO.*; import com.viewsh.module.ops.controller.admin.workorder.vo.statistics.DeviceTrafficRealtimeRespVO; @@ -621,8 +622,9 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime endDateTime = endDate.plusDays(1).atStartOfDay(); // 一次查询获取所有天的创建数 + Long tenantId = TenantContextHolder.getRequiredTenantId(); List createdRows = opsOrderMapper.selectCreatedCountGroupByDate( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, tenantId); Map createdMap = createdRows.stream() .collect(Collectors.toMap( row -> row.getStatDate().toString(), @@ -632,7 +634,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { // 一次查询获取所有天的完成数 List completedRows = opsOrderMapper.selectCompletedCountGroupByDate( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, tenantId); Map completedMap = completedRows.stream() .collect(Collectors.toMap( row -> row.getStatDate().toString(), @@ -666,7 +668,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime startDateTime, LocalDateTime endDateTime) { List rows = opsOrderMapper.selectCountGroupByHour( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, TenantContextHolder.getRequiredTenantId()); // 构建小时 -> 计数映射 int[] hourBuckets = new int[24]; @@ -696,7 +698,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime endDateTime = endDate.plusDays(1).atStartOfDay(); List rows = opsOrderMapper.selectAvgTimeGroupByDate( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, TenantContextHolder.getRequiredTenantId()); // 构建日期 -> 响应/完成时长映射 Map responseMap = new HashMap<>(); @@ -779,7 +781,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime startDateTime, LocalDateTime endDateTime) { List rows = opsOrderMapper.selectCountGroupByDayOfWeekAndHour( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, TenantContextHolder.getRequiredTenantId()); // 生成近7天的日期列表(格式:MM-dd) LocalDate startDate = startDateTime.toLocalDate(); @@ -843,7 +845,8 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { * 构建功能类型排行(将枚举值转换为中文) */ private List buildFunctionTypeRanking(String orderType) { - List rows = opsOrderMapper.selectCountGroupByFunctionType(orderType); + List rows = opsOrderMapper.selectCountGroupByFunctionType( + orderType, TenantContextHolder.getRequiredTenantId()); return rows.stream() .map(row -> { @@ -959,7 +962,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime todayStart, LocalDateTime todayEnd) { List rows = opsOrderMapper.selectCountGroupByHour( - orderType, todayStart, todayEnd); + orderType, todayStart, todayEnd, TenantContextHolder.getRequiredTenantId()); int[] hourBuckets = new int[24]; for (HourCountRespVO row : rows) { @@ -1079,7 +1082,7 @@ public class OpsStatisticsServiceImpl implements OpsStatisticsService { LocalDateTime endDateTime = endDate.plusDays(1).atStartOfDay(); List rows = opsOrderMapper.selectCreatedCountGroupByDate( - orderType, startDateTime, endDateTime); + orderType, startDateTime, endDateTime, TenantContextHolder.getRequiredTenantId()); Map countMap = rows.stream() .collect(Collectors.toMap( row -> row.getStatDate().toString(), diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/statistics/OpsTrafficStatisticsMapper.xml b/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/statistics/OpsTrafficStatisticsMapper.xml index 6dd2ded..275799a 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/statistics/OpsTrafficStatisticsMapper.xml +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/statistics/OpsTrafficStatisticsMapper.xml @@ -14,6 +14,7 @@ DELETE FROM ops_traffic_statistics WHERE stat_hour < #{beforeTime} + AND tenant_id = #{tenantId} AND deleted = 0 diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/workorder/OpsOrderMapper.xml b/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/workorder/OpsOrderMapper.xml index 1fa3758..cfef5bf 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/workorder/OpsOrderMapper.xml +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/resources/mapper/workorder/OpsOrderMapper.xml @@ -1,119 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +