diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/BeaconDetectionRuleProcessor.java b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/BeaconDetectionRuleProcessor.java index 2d21d20..978b2bf 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/BeaconDetectionRuleProcessor.java +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/BeaconDetectionRuleProcessor.java @@ -172,6 +172,15 @@ public class BeaconDetectionRuleProcessor { log.info("[BeaconDetection] 离开确认:deviceId={}, areaId={}, window={}", deviceId, areaId, window); + // P0 插队校验:检查当前工单是否属于正在检查的区域 + if (isSwitchingOrder(deviceId, areaId)) { + log.debug("[BeaconDetection][P0Interrupt] 检测到工单切换,跳过区域 {} 的离岗处理", + areaId); + // 清理该区域的离岗记录(避免内存泄漏) + signalLossRedisDAO.clearLossRecord(deviceId, areaId); + return; + } + BeaconPresenceConfig.ExitConfig exitConfig = beaconConfig.getExit(); // 1. 检查是否是首次丢失 @@ -279,4 +288,19 @@ public class BeaconDetectionRuleProcessor { return RssiSlidingWindowDetector.AreaState.OUT_AREA; } + + /** + * 检查是否正在切换工单(P0 插队场景) + *

+ * 如果当前工单的区域ID与正在检查的区域不一致,说明保洁员已切换到其他区域的工单 + * + * @param deviceId 设备ID + * @param areaId 正在检查的区域ID + * @return true-工单切换场景,false-正常离岗场景 + */ + private boolean isSwitchingOrder(Long deviceId, Long areaId) { + DeviceCurrentOrderRedisDAO.OrderCacheInfo currentOrder = + deviceCurrentOrderRedisDAO.getCurrentOrder(deviceId); + return currentOrder != null && !currentOrder.getAreaId().equals(areaId); + } } 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 4fb076d..2d1f0fd 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 @@ -112,6 +112,15 @@ public class SignalLossRuleProcessor { * 检查单个设备的离岗超时 */ private void checkTimeoutForDevice(Long deviceId, Long areaId) { + // P0 插队校验:检查当前工单是否属于正在检查的区域 + if (isSwitchingOrder(deviceId, areaId)) { + log.debug("[SignalLoss][P0Interrupt] 检测到工单切换,跳过区域 {} 的超时检查", + areaId); + // 清理该区域的离岗记录(避免内存泄漏) + signalLossRedisDAO.clearLossRecord(deviceId, areaId); + return; + } + // 1. 获取配置 CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper configWrapper = configService.getConfigWrapperByDeviceId(deviceId); @@ -306,4 +315,19 @@ public class SignalLossRuleProcessor { publishAuditEvent("TTS_REQUEST", deviceId, null, null, text, data); } + + /** + * 检查是否正在切换工单(P0 插队场景) + *

+ * 如果当前工单的区域ID与正在检查的区域不一致,说明保洁员已切换到其他区域的工单 + * + * @param deviceId 设备ID + * @param areaId 正在检查的区域ID + * @return true-工单切换场景,false-正常离岗场景 + */ + private boolean isSwitchingOrder(Long deviceId, Long areaId) { + DeviceCurrentOrderRedisDAO.OrderCacheInfo currentOrder = + deviceCurrentOrderRedisDAO.getCurrentOrder(deviceId); + return currentOrder != null && !currentOrder.getAreaId().equals(areaId); + } }