diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/SignalLossRuleProcessor.java b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/SignalLossRuleProcessor.java index b7163ac..b7fd3d9 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/SignalLossRuleProcessor.java +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/SignalLossRuleProcessor.java @@ -13,6 +13,7 @@ import com.xxl.job.core.handler.annotation.XxlJob; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; +import com.viewsh.framework.tenant.core.util.TenantUtils; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; @@ -67,6 +68,15 @@ public class SignalLossRuleProcessor { */ @XxlJob("signalLossCheckJob") public String checkLossTimeout() { + // TODO: 设置租户上下文(单租户场景使用固定租户ID=1) + // 确保后续发送的 RocketMQ 消息正确携带租户信息 + return TenantUtils.execute(1L, () -> doCheckLossTimeout()); + } + + /** + * 执行离岗超时检查 + */ + private String doCheckLossTimeout() { try { log.debug("[SignalLoss] 开始检查离岗超时"); @@ -122,8 +132,8 @@ public class SignalLossRuleProcessor { } // 1. 获取该区域的信标配置(从 BEACON 类型的设备获取) - CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper beaconConfigWrapper = - configService.getConfigByAreaIdAndRelationType(areaId, "BEACON"); + CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper beaconConfigWrapper = configService + .getConfigByAreaIdAndRelationType(areaId, "BEACON"); if (beaconConfigWrapper == null || beaconConfigWrapper.getConfig() == null || beaconConfigWrapper.getConfig().getBeaconPresence() == null) { @@ -134,8 +144,8 @@ public class SignalLossRuleProcessor { BeaconPresenceConfig.ExitConfig exitConfig = beaconConfigWrapper.getConfig().getBeaconPresence().getExit(); // 2. 获取工牌设备信息(用于获取 deviceKey) - CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper badgeConfigWrapper = - configService.getConfigWrapperByDeviceId(deviceId); + CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper badgeConfigWrapper = configService + .getConfigWrapperByDeviceId(deviceId); String badgeDeviceKey = (badgeConfigWrapper != null) ? badgeConfigWrapper.getDeviceKey() : null; @@ -194,8 +204,8 @@ public class SignalLossRuleProcessor { * 处理无效作业(时长不足) */ private void handleInvalidWork(Long deviceId, String deviceKey, Long areaId, - Long durationMs, Long minValidWorkMillis, - BeaconPresenceConfig.ExitConfig exitConfig) { + Long durationMs, Long minValidWorkMillis, + BeaconPresenceConfig.ExitConfig exitConfig) { log.warn("[SignalLoss] 作业时长不足,抑制自动完成:deviceId={}, duration={}ms, minRequired={}ms", deviceId, durationMs, minValidWorkMillis); @@ -222,13 +232,12 @@ public class SignalLossRuleProcessor { * 处理超时自动完成 */ private void handleTimeoutComplete(Long deviceId, String deviceKey, Long areaId, - Long durationMs, Long lastLossTime) { + Long durationMs, Long lastLossTime) { log.info("[SignalLoss] 触发自动完成:deviceId={}, areaId={}, duration={}ms", deviceId, areaId, durationMs); // 1. 获取当前工单 - BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = - badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId); + BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId); if (currentOrder == null) { log.warn("[SignalLoss] 设备无当前工单:deviceId={}", deviceId); @@ -291,7 +300,7 @@ public class SignalLossRuleProcessor { * 发布审计事件 */ private void publishAuditEvent(String auditType, Long deviceId, String deviceKey, - Long areaId, String message, Map data) { + Long areaId, String message, Map data) { try { CleanOrderAuditEvent event = CleanOrderAuditEvent.builder() .eventId(java.util.UUID.randomUUID().toString()) @@ -332,8 +341,7 @@ public class SignalLossRuleProcessor { * @return true-工单切换场景,false-正常离岗场景 */ private boolean isSwitchingOrder(Long deviceId, Long areaId) { - BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = - badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId); + BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId); return currentOrder != null && !currentOrder.getAreaId().equals(areaId); } }