From 1d056a5e7ab6d70a8a64f07cffdcdff0725e0e93 Mon Sep 17 00:00:00 2001 From: lzh Date: Mon, 19 Jan 2026 10:52:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(iot):=20=E4=BF=A1=E5=8F=B7=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E6=8F=90=E9=86=92=20&=20=E5=B7=A5=E5=8D=95=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=A3=80=E6=B5=8B=E6=8E=92=E9=99=A4P0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BeaconDetectionRuleProcessor.java | 24 +++++++++++++++++++ .../processor/SignalLossRuleProcessor.java | 24 +++++++++++++++++++ 2 files changed, 48 insertions(+) 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); + } }