@ -162,19 +162,27 @@ public class DeviceMessageProcessor {
// 场景一:从“正常”变为“告警” -> 创建新告警
// 场景一:从“正常”变为“告警” -> 创建新告警
if ( shouldBeInAlarm & & ! isCurrentlyInAlarm ) {
if ( shouldBeInAlarm & & ! isCurrentlyInAlarm ) {
HandAlarmSaveReqVO alarm = new HandAlarmSaveReqVO ( ) ;
HandAlarmSaveReqVO alarm = new HandAlarmSaveReqVO ( ) ;
alarm . setId ( null ) ;
alarm . setDetectorId ( handVo . getId ( ) ) ;
alarm . setSn ( handVo . getSn ( ) ) ;
alarm . setAlarmType ( AlarmType . BATTERY . getType ( ) ) ;
alarm . setAlarmType ( AlarmType . BATTERY . getType ( ) ) ;
alarm . setTAlarmStart ( LocalDateTime . now ( ) ) ;
alarm . setTAlarmStart ( LocalDateTime . now ( ) ) ;
alarm . setVAlarmFirst ( handVo . getFirstValue ( ) ) ;
alarm . setVAlarmFirst ( handVo . getFirstValue ( ) ) ;
alarm . setPicX ( handVo . getLatitude ( ) ) ;
alarm . setPicX ( handVo . getLatitude ( ) ) ;
alarm . setPicY ( handVo . getLongitude ( ) ) ;
alarm . setPicY ( handVo . getLongitude ( ) ) ;
alarm . setCreator ( "admin" ) ;
alarm . setCreateTime ( LocalDateTime . now ( ) ) ;
handAlarmService . createHandAlarm ( alarm ) ;
handAlarmService . createHandAlarm ( alarm ) ;
// 场景二:从“告警”变为“正常” -> 结束告警
// 场景二:从“告警”变为“正常” -> 结束告警
} else if ( ! shouldBeInAlarm & & isCurrentlyInAlarm ) {
} else if ( ! shouldBeInAlarm & & isCurrentlyInAlarm ) {
HandAlarmSaveReqVO alarm = new HandAlarmSaveReqVO ( ) ;
HandAlarmDO alarm = new HandAlarmDO ( ) ;
alarm . setId ( handVo . getBatteryStatusAlarmId ( ) ) ;
alarm . setTAlarmEnd ( LocalDateTime . now ( ) ) ;
alarm . setTAlarmEnd ( LocalDateTime . now ( ) ) ;
alarm . setUpdater ( "admin" ) ;
alarm . setUpdateTime ( LocalDateTime . now ( ) ) ;
// alarm.setId(handVo.getBatteryStatusAlarmId()); // 别忘了传递告警ID
// alarm.setId(handVo.getBatteryStatusAlarmId()); // 别忘了传递告警ID
handAlarmService . updateHandAlarm ( alarm ) ;
handAlarmService . updateById ( alarm ) ;
}
}
// 如果状态未变(持续告警或持续正常),不执行任何数据库操作。
// 如果状态未变(持续告警或持续正常),不执行任何数据库操作。
// 根据当前是否应该告警来设置最终的正确状态。
// 根据当前是否应该告警来设置最终的正确状态。
@ -182,6 +190,7 @@ public class DeviceMessageProcessor {
handVo . setBatteryStatus ( EnableStatus . ENABLED . value ( ) ) ;
handVo . setBatteryStatus ( EnableStatus . ENABLED . value ( ) ) ;
} else {
} else {
handVo . setBatteryStatus ( EnableStatus . DISABLED . value ( ) ) ;
handVo . setBatteryStatus ( EnableStatus . DISABLED . value ( ) ) ;
handVo . setBatteryStatusAlarmId ( null ) ;
}
}
}
}
@ -202,9 +211,11 @@ public class DeviceMessageProcessor {
HandAlarmDO alarm = new HandAlarmDO ( ) ;
HandAlarmDO alarm = new HandAlarmDO ( ) ;
alarm . setTAlarmEnd ( vo . getTAlarmEnd ( ) ) ;
alarm . setTAlarmEnd ( vo . getTAlarmEnd ( ) ) ;
alarm . setId ( vo . getAlarmId ( ) ) ;
alarm . setId ( vo . getAlarmId ( ) ) ;
alarm . setVAlarmFirst ( vo . getFirstValue ( ) ) ;
alarm . setVAlarmMaximum ( vo . getMaxValue ( ) ) ;
alarm . setVAlarmMaximum ( vo . getMaxValue ( ) ) ;
alarm . setAlarmLevel ( vo . getMaxAlarmLevel ( ) ) ;
alarm . setAlarmLevel ( vo . getMaxAlarmLevel ( ) ) ;
alarm . setTenantId ( vo . getTenantId ( ) ) ;
alarm . setTenantId ( vo . getTenantId ( ) ) ;
alarm . setStatus ( EnableStatus . HANDLE . value ( ) ) ;
int count = handAlarmService . updateById ( alarm ) ;
int count = handAlarmService . updateById ( alarm ) ;
if ( count > 0 ) {
if ( count > 0 ) {
log . info ( "报警事件(ID: {})已结束,成功更新数据库。" , alarm . getId ( ) ) ;
log . info ( "报警事件(ID: {})已结束,成功更新数据库。" , alarm . getId ( ) ) ;
@ -222,17 +233,33 @@ public class DeviceMessageProcessor {
} else {
} else {
if ( vo . getAlarmId ( ) = = null ) {
if ( vo . getAlarmId ( ) = = null ) {
HandAlarmSaveReqVO alarmDO = BeanUtils . toBean ( vo , HandAlarmSaveReqVO . class ) ;
HandAlarmSaveReqVO alarmDO = BeanUtils . toBean ( vo , HandAlarmSaveReqVO . class ) ;
alarmDO . setId ( null ) ;
alarmDO . setDetectorId ( vo . getId ( ) ) ;
alarmDO . setSn ( vo . getSn ( ) ) ;
alarmDO . setVAlarmFirst ( vo . getFirstValue ( ) ) ;
alarmDO . setGasType ( vo . getGasChemical ( ) ) ;
alarmDO . setPicX ( vo . getLatitude ( ) ) ;
alarmDO . setPicY ( vo . getLongitude ( ) ) ;
alarmDO . setAlarmType ( AlarmType . GAS . getType ( ) ) ;
alarmDO . setCreator ( "admin" ) ;
alarmDO . setCreateTime ( LocalDateTime . now ( ) ) ;
Long count = handAlarmService . createHandAlarm ( alarmDO ) ;
Long count = handAlarmService . createHandAlarm ( alarmDO ) ;
if ( count > 0 ) {
if ( count > 0 ) {
vo . setAlarmId ( count ) ;
vo . setAlarmId ( count ) ;
log . info ( "新报警事件已创建,数据库ID: {},并已回写至Redis。" , count ) ;
log . info ( "新报警事件已创建,数据库ID: {},并已回写至Redis。" , count ) ;
}
}
} else {
} else {
if ( vo . getValue ( ) < = vo . getMaxValue ( ) ) {
return ;
}
// -- 更新 --
// -- 更新 --
HandAlarmDO alarmToUpdate = new HandAlarmDO ( ) ;
HandAlarmDO alarmToUpdate = new HandAlarmDO ( ) ;
alarmToUpdate . setId ( vo . getAlarmId ( ) ) ;
alarmToUpdate . setId ( vo . getAlarmId ( ) ) ;
alarmToUpdate . setVAlarmMaximum ( vo . getMaxValue ( ) ) ;
alarmToUpdate . setVAlarmMaximum ( vo . getMaxValue ( ) ) ;
alarmToUpdate . setUpdater ( "admin" ) ;
alarmToUpdate . setUpdateTime ( LocalDateTime . now ( ) ) ;
alarmToUpdate . setTenantId ( vo . getTenantId ( ) ) ;
handAlarmService . updateById ( alarmToUpdate ) ;
handAlarmService . updateById ( alarmToUpdate ) ;
}
}
}
}
@ -300,25 +327,29 @@ public class DeviceMessageProcessor {
// --- 场景:当前处于违规状态 ---
// --- 场景:当前处于违规状态 ---
// 计算当前的违规距离
// 计算当前的违规距离
double currentDistance = GeofenceUtils . fenceDistance ( handVo , fenceType , fenceList ) ;
double currentDistance = GeofenceUtils . fenceDistance ( handVo , fenceType , fenceList ) ;
String formattedDistance = String . format ( "%.2f" , currentDistance ) ;
double roundedDistance = Double . parseDouble ( formattedDistance ) ;
if ( ! hasOngoingAlarm ) {
if ( ! hasOngoingAlarm ) {
// 1. 【触发新报警】: 之前不报警,现在开始违规
// 1. 【触发新报警】: 之前不报警,现在开始违规
log . warn ( "触发 [{}] 类型围栏报警! sn: {}" , fenceType , handVo . getSn ( ) ) ;
log . warn ( "触发 [{}] 类型围栏报警! sn: {}" , fenceType , handVo . getSn ( ) ) ;
//log.warn("当前位置距离【{}】类型围栏违规距离为:{}米。", fenceType, currentDistance);
FenceAlarmSaveReqVO newAlarm = new FenceAlarmSaveReqVO ( ) ;
FenceAlarmSaveReqVO newAlarm = new FenceAlarmSaveReqVO ( ) ;
newAlarm . setDetectorId ( handVo . getId ( ) ) ;
newAlarm . setDetectorId ( handVo . getId ( ) ) ;
newAlarm . setSn ( handVo . getSn ( ) ) ;
/* newAlarm.setFenceId(fenceDO.getId());*/
/* newAlarm.setFenceId(fenceDO.getId());*/
newAlarm . setType ( fenceType . getType ( ) ) ;
newAlarm . setType ( fenceType . getType ( ) ) ;
newAlarm . setTAlarmStart ( LocalDateTime . now ( ) ) ; // 记录报警开始时间
newAlarm . setTAlarmStart ( LocalDateTime . now ( ) ) ; // 记录报警开始时间
newAlarm . setPicX ( handVo . getLongitude ( ) ) ;
newAlarm . setPicX ( handVo . getLongitude ( ) ) ;
newAlarm . setPicY ( handVo . getLatitude ( ) ) ;
newAlarm . setPicY ( handVo . getLatitude ( ) ) ;
newAlarm . setTenantId ( handVo . getTenantId ( ) ) ;
newAlarm . setTenantId ( handVo . getTenantId ( ) ) ;
// 初始化距离
// 初始化距离
newAlarm . setDistance ( currentDistance ) ;
newAlarm . setMaxDistance ( currentDistance ) ;
handVo . setDistance ( currentDistance ) ;
handVo . setMaxDistance ( currentDistance ) ;
newAlarm . setDistance ( roundedDistance ) ;
newAlarm . setMaxDistance ( roundedDistance ) ;
newAlarm . setCreator ( "admin" ) ;
newAlarm . setCreateTime ( LocalDateTime . now ( ) ) ;
handVo . setDistance ( roundedDistance ) ;
handVo . setMaxDistance ( roundedDistance ) ;
// 保存新报警,并获取返回的ID,用于更新 handVo 的状态
// 保存新报警,并获取返回的ID,用于更新 handVo 的状态
Long fenceAlarm = fenceAlarmService . createFenceAlarm ( newAlarm ) ;
Long fenceAlarm = fenceAlarmService . createFenceAlarm ( newAlarm ) ;
@ -338,10 +369,10 @@ public class DeviceMessageProcessor {
return ;
return ;
}
}
existingAlarm . setDistance ( current Distance) ;
if ( existingAlarm . getMaxDistance ( ) = = null | | current Distance > existingAlarm . getMaxDistance ( ) ) {
existingAlarm . setMaxDistance ( current Distance) ;
handVo . setMaxDistance ( current Distance) ;
existingAlarm . setDistance ( rounded Distance) ;
if ( existingAlarm . getMaxDistance ( ) = = null | | rounded Distance > existingAlarm . getMaxDistance ( ) ) {
existingAlarm . setMaxDistance ( rounded Distance) ;
handVo . setMaxDistance ( rounded Distance) ;
}
}
fenceAlarmService . update ( existingAlarm ) ;
fenceAlarmService . update ( existingAlarm ) ;
}
}
@ -356,6 +387,7 @@ public class DeviceMessageProcessor {
FenceAlarmDO fenceAlarmDO = new FenceAlarmDO ( ) ;
FenceAlarmDO fenceAlarmDO = new FenceAlarmDO ( ) ;
fenceAlarmDO . setId ( handVo . getFenceAlarmId ( ) ) ;
fenceAlarmDO . setId ( handVo . getFenceAlarmId ( ) ) ;
fenceAlarmDO . setTAlarmEnd ( LocalDateTime . now ( ) ) ;
fenceAlarmDO . setTAlarmEnd ( LocalDateTime . now ( ) ) ;
fenceAlarmDO . setStatus ( EnableStatus . HANDLE . value ( ) ) ;
fenceAlarmService . update ( fenceAlarmDO ) ;
fenceAlarmService . update ( fenceAlarmDO ) ;
// *** 关键:重置内存/缓存中的 handVo 状态 ***
// *** 关键:重置内存/缓存中的 handVo 状态 ***
@ -375,6 +407,12 @@ public class DeviceMessageProcessor {
Long gasTypeId = handVo . getGasTypeId ( ) ;
Long gasTypeId = handVo . getGasTypeId ( ) ;
List < AlarmRuleDO > gasAlarmRuleList = ruleMap . get ( gasTypeId ) ;
List < AlarmRuleDO > gasAlarmRuleList = ruleMap . get ( gasTypeId ) ;
// 2. 如果获取结果为 null,再尝试将其作为 String key 获取一次
// 这是为了兼容从 Redis 缓存中反序列化回来的 Map<String, List> 的情况
if ( gasAlarmRuleList = = null ) {
gasAlarmRuleList = ruleMap . get ( gasTypeId . toString ( ) ) ;
}
if ( gasAlarmRuleList = = null | | gasAlarmRuleList . isEmpty ( ) ) {
if ( gasAlarmRuleList = = null | | gasAlarmRuleList . isEmpty ( ) ) {
log . error ( "无报警规则:detector={} gas type={} value={}" , handVo . getSn ( ) , handVo . getGasChemical ( ) , gasValue ) ;
log . error ( "无报警规则:detector={} gas type={} value={}" , handVo . getSn ( ) , handVo . getGasChemical ( ) , gasValue ) ;
@ -475,6 +513,10 @@ public class DeviceMessageProcessor {
// 将字符串按逗号分割成数组
// 将字符串按逗号分割成数组
String [ ] split = numbersString . split ( "," ) ;
String [ ] split = numbersString . split ( "," ) ;
if ( split . length ! = 3 ) {
log . error ( "数据格式错误:{}" , payload ) ;
return detector ;
}
Map < String , Double > wgs84ToGcj02 = CoordinateTransferUtils . wgs84ToGcj02 ( Double . parseDouble ( split [ 0 ] ) , Double . parseDouble ( split [ 1 ] ) ) ;
Map < String , Double > wgs84ToGcj02 = CoordinateTransferUtils . wgs84ToGcj02 ( Double . parseDouble ( split [ 0 ] ) , Double . parseDouble ( split [ 1 ] ) ) ;
Double lon = wgs84ToGcj02 . get ( "lon" ) ;
Double lon = wgs84ToGcj02 . get ( "lon" ) ;