feat(iot): 信号丢失提醒 & 工单完成检测排除P0

This commit is contained in:
lzh
2026-01-19 10:52:21 +08:00
parent 64928f5a3f
commit 1d056a5e7a
2 changed files with 48 additions and 0 deletions

View File

@@ -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 插队场景)
* <p>
* 如果当前工单的区域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);
}
}

View File

@@ -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 插队场景)
* <p>
* 如果当前工单的区域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);
}
}