添加人员聚集报警,非法停车报警

This commit is contained in:
15683799673
2025-08-31 19:11:26 +08:00
parent b1f0ce3d3c
commit d29c901352
11 changed files with 243 additions and 9 deletions

View File

@@ -37,6 +37,7 @@ public enum EventSmallTypeEnum {
EQP_REPORT_SBSB(1025, "报警设备上报"), EQP_REPORT_SBSB(1025, "报警设备上报"),
BLACK_PERSON(1026, "黑名单人员"), BLACK_PERSON(1026, "黑名单人员"),
AUTHORIZATION_EXPIRED(1027, "门禁授权已过期"), AUTHORIZATION_EXPIRED(1027, "门禁授权已过期"),
ILLEGAL_PARKING(1028,"非法停车"),
/* -----------------------系统报警相关-------------------------------------*/ /* -----------------------系统报警相关-------------------------------------*/
SYS_REPORT_WLGZ(2001, "网络连接故障"), SYS_REPORT_WLGZ(2001, "网络连接故障"),
SYS_REPORT_DLYC(2002, "用户登录异常"), SYS_REPORT_DLYC(2002, "用户登录异常"),

View File

@@ -20,5 +20,8 @@ public interface RocketMqConstants {
String FACECAPTURE = "FACE_CAPTURE_REPORT"; String FACECAPTURE = "FACE_CAPTURE_REPORT";
// 人脸比对 // 人脸比对
String FACECOMPARE = "FACE_COMPARE_REPORT"; String FACECOMPARE = "FACE_COMPARE_REPORT";
// 人员聚集上报
String HIGH_DENSITY = "HIGH_DENSITY_REPORT";
// 停车上报
String PARKING_ALARM = "PARKING_ALARM_REPORT";
} }

View File

@@ -0,0 +1,44 @@
package org.dromara.sis.rocketmq.consumer;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.dromara.sis.rocketmq.RocketMqConstants;
import org.dromara.sis.rocketmq.domain.FaceCapture;
import org.dromara.sis.rocketmq.domain.HighDensity;
import org.dromara.sis.service.IZeroSensationPassageService;
import org.springframework.stereotype.Component;
/**
* 人员聚集消费者
*
* @author lxj
*/
@Slf4j
@Component
@RequiredArgsConstructor
@RocketMQMessageListener(
topic = RocketMqConstants.TOPIC,
consumerGroup = RocketMqConstants.CAPTUREGROUP,
selectorExpression = RocketMqConstants.HIGH_DENSITY
)
public class HighDensityConsumer implements RocketMQListener<MessageExt> {
private final IZeroSensationPassageService zeroSensationPassageService;
@Override
public void onMessage(MessageExt ext) {
log.info("消费人员聚集数据,数据长度={}", ext.getBody().length);
try {
HighDensity f = JSONObject.parseObject(ext.getBody(), HighDensity.class);
} catch (Exception e) {
log.error("消费人脸抓拍数据处理失败,", e);
}
}
}

View File

@@ -0,0 +1,43 @@
package org.dromara.sis.rocketmq.consumer;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.dromara.sis.rocketmq.RocketMqConstants;
import org.dromara.sis.rocketmq.domain.ParkingReport;
import org.dromara.sis.service.IZeroSensationPassageService;
import org.springframework.stereotype.Component;
/**
* 人员聚集消费者
*
* @author lxj
*/
@Slf4j
@Component
@RequiredArgsConstructor
@RocketMQMessageListener(
topic = RocketMqConstants.TOPIC,
consumerGroup = RocketMqConstants.CAPTUREGROUP,
selectorExpression = RocketMqConstants.HIGH_DENSITY
)
public class ParkingDelayConsumer implements RocketMQListener<MessageExt> {
private final IZeroSensationPassageService zeroSensationPassageService;
@Override
public void onMessage(MessageExt ext) {
log.info("消费停车检测数据,数据长度={}", ext.getBody().length);
try {
ParkingReport report = JSONObject.parseObject(ext.getBody(), ParkingReport.class);
} catch (Exception e) {
log.error("消费人脸抓拍数据处理失败,", e);
}
}
}

View File

@@ -0,0 +1,38 @@
package org.dromara.sis.rocketmq.domain;
import lombok.Data;
/**
* 人员聚集报警
*
* @author lxj
*/
@Data
public class HighDensity {
/**
* 报警图片
*/
private byte[] img;
/**
* 设备ip
*/
private String deviceIp;
/**
* 人员密度0.1-1.0
*/
private Double density;
/**
* 灵敏度参数,取值范围:[1,5]
*/
private Byte sensitivity;
/**
* 触发人员聚集参数报警阈值20~360s
*/
private Integer wDuration;
}

View File

@@ -0,0 +1,28 @@
package org.dromara.sis.rocketmq.domain;
import lombok.Data;
/**
* 区域停车报警
* @author lxj
*/
@Data
public class ParkingReport {
/**
* 报警图片
*/
private byte[] img;
/**
* 设备ip
*/
private String deviceIp;
/**
* 触发人员聚集参数报警阈值20~360s
*/
private Integer pDuration;
}

View File

@@ -0,0 +1,26 @@
package org.dromara.sis.service;
import org.dromara.sis.rocketmq.domain.HighDensity;
import org.dromara.sis.rocketmq.domain.ParkingReport;
/**
* 事件告警上报处理服务
*
* @author lxj
*/
public interface IEventAlarmReportService {
/**
* 处理停车滞留上报
*
* @param report 上报信息
*/
void handleParking(ParkingReport report);
/**
* 处理人员聚集事件上报
*
* @param density 上报信息
*/
void handleHighDensity(HighDensity density);
}

View File

@@ -80,7 +80,7 @@ public interface ISisAlarmEventsService {
/** /**
* 异步生成告警记录 * 异步生成告警记录
*/ */
SisAlarmEvents createAlarmRecord(String deviceIp, Integer level, EventSmallTypeEnum type, String msg, byte[] smallImg, byte[] bigImg); SisAlarmEvents createAlarmRecord(String deviceIp, Integer level, EventSmallTypeEnum type, String msg, List<byte[]> imgs);
/** /**
* 任务分配操作 * 任务分配操作

View File

@@ -0,0 +1,51 @@
package org.dromara.sis.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.domain.SisAlarmEvents;
import org.dromara.sis.domain.enums.EventSmallTypeEnum;
import org.dromara.sis.rocketmq.domain.HighDensity;
import org.dromara.sis.rocketmq.domain.ParkingReport;
import org.dromara.sis.service.IEventAlarmReportService;
import org.dromara.sis.service.ISisAlarmEventsService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 处理设备告警上报服务
*
* @author lxj
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class EventAlarmReportServiceImpl implements IEventAlarmReportService {
private final ISisAlarmEventsService alarmEventsService;
@Override
public void handleParking(ParkingReport report) {
handleAlarm(report.getDeviceIp(), report.getImg(), 2, EventSmallTypeEnum.ILLEGAL_PARKING, "非法停车报警");
}
@Override
public void handleHighDensity(HighDensity density) {
handleAlarm(density.getDeviceIp(), density.getImg(), 2, EventSmallTypeEnum.SMART_REPORT_RYJJ, "人员聚集报警");
}
/**
* 处理告警信息
*
* @param deviceIp 设备ip
* @param img 图片
* @param smallType 事件类型
*/
private void handleAlarm(String deviceIp, byte[] img, Integer level, EventSmallTypeEnum smallType, String desc) {
// 生成告警记录
SisAlarmEvents alarmRecord = alarmEventsService.createAlarmRecord(deviceIp, level, smallType, desc, List.of(img));
}
}

View File

@@ -180,7 +180,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public SisAlarmEvents createAlarmRecord(String deviceIp, Integer level, EventSmallTypeEnum type, String msg, byte[] smallImg, byte[] bigImg) { public SisAlarmEvents createAlarmRecord(String deviceIp, Integer level, EventSmallTypeEnum type, String msg, List<byte[]> imgs) {
// 校验设备信息 // 校验设备信息
SisDeviceManage sisDeviceManage = deviceManageService.queryByDeviceIp(deviceIp); SisDeviceManage sisDeviceManage = deviceManageService.queryByDeviceIp(deviceIp);
if (sisDeviceManage == null) { if (sisDeviceManage == null) {
@@ -223,11 +223,8 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
// 写入附件表 // 写入附件表
List<SisAlarmEventAttachments> ls = new ArrayList<>(); List<SisAlarmEventAttachments> ls = new ArrayList<>();
if (smallImg != null && smallImg.length > 0) { for (byte[] img : imgs) {
ls.add(createEventAttachments(smallImg, alarmEvents, sisDeviceManage)); ls.add(createEventAttachments(img, alarmEvents, sisDeviceManage));
}
if (bigImg != null && bigImg.length > 0) {
ls.add(createEventAttachments(bigImg, alarmEvents, sisDeviceManage));
} }
Boolean flag = alarmEventAttachmentsService.batchInsert(ls); Boolean flag = alarmEventAttachmentsService.batchInsert(ls);
log.info("写入告警事件附件表完成, reslut={}, size={}", flag, ls.size()); log.info("写入告警事件附件表完成, reslut={}, size={}", flag, ls.size());

View File

@@ -146,8 +146,11 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
* @param smallType 事件类型 * @param smallType 事件类型
*/ */
private void handleAlarm(String deviceIp, byte[] smallImg, byte[] bigImg, Integer level, EventSmallTypeEnum smallType, String desc) { private void handleAlarm(String deviceIp, byte[] smallImg, byte[] bigImg, Integer level, EventSmallTypeEnum smallType, String desc) {
List<byte[]> ls = new ArrayList<>(2);
ls.add(smallImg);
ls.add(bigImg);
// 生成告警记录 // 生成告警记录
SisAlarmEvents alarmRecord = alarmEventsService.createAlarmRecord(deviceIp, level, smallType, desc, smallImg, bigImg); SisAlarmEvents alarmRecord = alarmEventsService.createAlarmRecord(deviceIp, level, smallType, desc, ls);
SaTokenContextMockUtil.setMockContext(() -> { SaTokenContextMockUtil.setMockContext(() -> {
// 如果当前设备区域存在排班人员,那么惊醒自动指派操作 // 如果当前设备区域存在排班人员,那么惊醒自动指派操作
List<RemoteAttendanceUserGroupVo> userGroupVos = remoteAttendanceService.queryAttendByCurrDateAndDeviceIp(new Date(), deviceIp); List<RemoteAttendanceUserGroupVo> userGroupVos = remoteAttendanceService.queryAttendByCurrDateAndDeviceIp(new Date(), deviceIp);