From 7f76de6073f1154069b78671076ae8ae92b07a55 Mon Sep 17 00:00:00 2001 From: lxj <15683799673@163.com> Date: Mon, 4 Aug 2025 19:04:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E6=84=9F=E9=80=9A?= =?UTF-8?q?=E8=A1=8C=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SisAlarmEventAttachmentsController.java | 107 ++++++++++++ .../controller/SisAlarmEventsController.java | 106 ++++++++++++ .../sis/domain/SisAlarmEventAttachments.java | 47 ++++++ .../dromara/sis/domain/SisAlarmEvents.java | 68 ++++++++ .../org/dromara/sis/domain/SisPersonLib.java | 5 + .../domain/bo/SisAlarmEventAttachmentsBo.java | 46 +++++ .../sis/domain/bo/SisAlarmEventsBo.java | 70 ++++++++ .../dromara/sis/domain/bo/SisPersonLibBo.java | 3 + .../domain/vo/SisAlarmEventAttachmentsVo.java | 52 ++++++ .../sis/domain/vo/SisAlarmEventsVo.java | 82 +++++++++ .../sis/domain/vo/SisDeviceBindRefVo.java | 1 + .../sis/domain/vo/SisElevatorFloorRefVo.java | 1 + .../dromara/sis/domain/vo/SisPersonLibVo.java | 2 + .../SisAlarmEventAttachmentsMapper.java | 15 ++ .../sis/mapper/SisAlarmEventsMapper.java | 15 ++ .../sis/sdk/hik/calback/HikAlarmCallBack.java | 158 ++---------------- .../ISisAlarmEventAttachmentsService.java | 68 ++++++++ .../sis/service/ISisAlarmEventsService.java | 69 ++++++++ .../service/IZeroSensationPassageService.java | 14 ++ .../SisAlarmEventAttachmentsServiceImpl.java | 134 +++++++++++++++ .../impl/SisAlarmEventsServiceImpl.java | 138 +++++++++++++++ .../impl/ZeroSensationPassageServiceImpl.java | 155 +++++++++++++++++ .../sis/SisAlarmEventAttachmentsMapper.xml | 7 + .../mapper/sis/SisAlarmEventsMapper.xml | 7 + 24 files changed, 1223 insertions(+), 147 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventAttachmentsController.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventsController.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEventAttachments.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventAttachmentsBo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventAttachmentsVo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventAttachmentsMapper.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventsMapper.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventAttachmentsService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/IZeroSensationPassageService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventAttachmentsServiceImpl.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java create mode 100644 ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventAttachmentsMapper.xml create mode 100644 ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventsMapper.xml diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventAttachmentsController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventAttachmentsController.java new file mode 100644 index 00000000..a5191f88 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventAttachmentsController.java @@ -0,0 +1,107 @@ +package org.dromara.sis.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.sis.domain.bo.SisAlarmEventAttachmentsBo; +import org.dromara.sis.domain.vo.SisAlarmEventAttachmentsVo; +import org.dromara.sis.service.ISisAlarmEventAttachmentsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 【请填写功能名称】 + * 前端访问路由地址为:/system/alarmEventAttachments + * + * @author mocheng + * @date 2025-08-04 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/alarmEventAttachments") +public class SisAlarmEventAttachmentsController extends BaseController { + + private final ISisAlarmEventAttachmentsService sisAlarmEventAttachmentsService; + + /** + * 查询【请填写功能名称】列表 + */ + @SaCheckPermission("system:alarmEventAttachments:list") + @GetMapping("/list") + public TableDataInfo list(SisAlarmEventAttachmentsBo bo, PageQuery pageQuery) { + return sisAlarmEventAttachmentsService.queryPageList(bo, pageQuery); + } + + /** + * 导出【请填写功能名称】列表 + */ + @SaCheckPermission("system:alarmEventAttachments:export") + @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SisAlarmEventAttachmentsBo bo, HttpServletResponse response) { + List list = sisAlarmEventAttachmentsService.queryList(bo); + ExcelUtil.exportExcel(list, "【请填写功能名称】", SisAlarmEventAttachmentsVo.class, response); + } + + /** + * 获取【请填写功能名称】详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:alarmEventAttachments:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(sisAlarmEventAttachmentsService.queryById(id)); + } + + /** + * 新增【请填写功能名称】 + */ + @SaCheckPermission("system:alarmEventAttachments:add") + @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SisAlarmEventAttachmentsBo bo) { + return toAjax(sisAlarmEventAttachmentsService.insertByBo(bo)); + } + + /** + * 修改【请填写功能名称】 + */ + @SaCheckPermission("system:alarmEventAttachments:edit") + @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SisAlarmEventAttachmentsBo bo) { + return toAjax(sisAlarmEventAttachmentsService.updateByBo(bo)); + } + + /** + * 删除【请填写功能名称】 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:alarmEventAttachments:remove") + @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(sisAlarmEventAttachmentsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventsController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventsController.java new file mode 100644 index 00000000..97d28cfa --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAlarmEventsController.java @@ -0,0 +1,106 @@ +package org.dromara.sis.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.sis.domain.vo.SisAlarmEventsVo; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.sis.service.ISisAlarmEventsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 告警 + * 前端访问路由地址为:/sis/alarmEvents + * + * @author lxj + * @date 2025-08-04 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/alarmEvents") +public class SisAlarmEventsController extends BaseController { + + private final ISisAlarmEventsService sisAlarmEventsService; + + /** + * 查询告警列表 + */ + @SaCheckPermission("sis:alarmEvents:list") + @GetMapping("/list") + public TableDataInfo list(SisAlarmEventsBo bo, PageQuery pageQuery) { + return sisAlarmEventsService.queryPageList(bo, pageQuery); + } + + /** + * 导出告警列表 + */ + @SaCheckPermission("sis:alarmEvents:export") + @Log(title = "告警", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SisAlarmEventsBo bo, HttpServletResponse response) { + List list = sisAlarmEventsService.queryList(bo); + ExcelUtil.exportExcel(list, "告警", SisAlarmEventsVo.class, response); + } + + /** + * 获取告警详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sis:alarmEvents:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(sisAlarmEventsService.queryById(id)); + } + + /** + * 新增告警 + */ + @SaCheckPermission("sis:alarmEvents:add") + @Log(title = "告警", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SisAlarmEventsBo bo) { + return toAjax(sisAlarmEventsService.insertByBo(bo)); + } + + /** + * 修改告警 + */ + @SaCheckPermission("sis:alarmEvents:edit") + @Log(title = "告警", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SisAlarmEventsBo bo) { + return toAjax(sisAlarmEventsService.updateByBo(bo)); + } + + /** + * 删除告警 + * + * @param ids 主键串 + */ + @SaCheckPermission("sis:alarmEvents:remove") + @Log(title = "告警", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(sisAlarmEventsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEventAttachments.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEventAttachments.java new file mode 100644 index 00000000..7e34cfbd --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEventAttachments.java @@ -0,0 +1,47 @@ +package org.dromara.sis.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 【请填写功能名称】对象 sis_alarm_event_attachments + * + * @author mocheng + * @date 2025-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sis_alarm_event_attachments") +public class SisAlarmEventAttachments extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 事件id + */ + private Long eventId; + + /** + * 时间图片id + */ + private String ossId; + + /** + * 1:图片,2:文件;3视频 + */ + private Long type; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java new file mode 100644 index 00000000..aa9c0bb6 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java @@ -0,0 +1,68 @@ +package org.dromara.sis.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 告警对象 sis_alarm_events + * + * @author lxj + * @date 2025-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sis_alarm_events") +public class SisAlarmEvents extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 报警记录ID + */ + @TableId(value = "id") + private Long id; + + /** + * 报警事件类型 + */ + private Long type; + + /** + * 报警记录级别(1:一般,2:中级,3:紧急) + */ + private Long level; + + /** + * 报警设备ip + */ + private String deviceIp; + + /** + * 报警设备名称 + */ + private String deviceName; + + /** + * 设备所属区域id + */ + private Long deviceGroupId; + + /** + * 设备所属区域名称 + */ + private String deviceGroupName; + + /** + * 设备告警时间 + */ + private Date reportTime; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java index c8ec2d61..459a3c90 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java @@ -37,4 +37,9 @@ public class SisPersonLib extends TenantEntity { * 人员库描述 */ private String libDesc; + + /** + * 1:白名单,2:黑名单,3:红名单l + */ + private Integer libType; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventAttachmentsBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventAttachmentsBo.java new file mode 100644 index 00000000..5fdc96fe --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventAttachmentsBo.java @@ -0,0 +1,46 @@ +package org.dromara.sis.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.sis.domain.SisAlarmEventAttachments; + +/** + * 【请填写功能名称】业务对象 sis_alarm_event_attachments + * + * @author mocheng + * @date 2025-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SisAlarmEventAttachments.class, reverseConvertGenerate = false) +public class SisAlarmEventAttachmentsBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 事件id + */ + @NotNull(message = "事件id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long eventId; + + /** + * 时间图片id + */ + private String ossId; + + /** + * 1:图片,2:文件;3视频 + */ + private Long type; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java new file mode 100644 index 00000000..04ed9212 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java @@ -0,0 +1,70 @@ +package org.dromara.sis.domain.bo; + +import org.dromara.sis.domain.SisAlarmEvents; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 告警业务对象 sis_alarm_events + * + * @author lxj + * @date 2025-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SisAlarmEvents.class, reverseConvertGenerate = false) +public class SisAlarmEventsBo extends BaseEntity { + + /** + * 报警记录ID + */ + @NotNull(message = "报警记录ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 报警事件类型 + */ + @NotNull(message = "报警事件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 报警记录级别(1:一般,2:中级,3:紧急) + */ + @NotNull(message = "报警记录级别(1:一般,2:中级,3:紧急)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 报警设备ip + */ + private String deviceIp; + + /** + * 报警设备名称 + */ + private String deviceName; + + /** + * 设备所属区域id + */ + private Long deviceGroupId; + + /** + * 设备所属区域名称 + */ + private String deviceGroupName; + + /** + * 设备告警时间 + */ + @NotNull(message = "设备告警时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date reportTime; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java index c373261b..7ecb0d95 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java @@ -36,4 +36,7 @@ public class SisPersonLibBo extends BaseEntity { * 人员库描述 */ private String libDesc; + + private Integer libType; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventAttachmentsVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventAttachmentsVo.java new file mode 100644 index 00000000..ca0c1380 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventAttachmentsVo.java @@ -0,0 +1,52 @@ +package org.dromara.sis.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.sis.domain.SisAlarmEventAttachments; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 【请填写功能名称】视图对象 sis_alarm_event_attachments + * + * @author mocheng + * @date 2025-08-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SisAlarmEventAttachments.class) +public class SisAlarmEventAttachmentsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 事件id + */ + @ExcelProperty(value = "事件id") + private Long eventId; + + /** + * 时间图片id + */ + @ExcelProperty(value = "时间图片id") + private String ossId; + + /** + * 1:图片,2:文件;3视频 + */ + @ExcelProperty(value = "1:图片,2:文件;3视频") + private Long type; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java new file mode 100644 index 00000000..9ab1e4ca --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java @@ -0,0 +1,82 @@ +package org.dromara.sis.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.sis.domain.SisAlarmEvents; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 告警视图对象 sis_alarm_events + * + * @author lxj + * @date 2025-08-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SisAlarmEvents.class) +public class SisAlarmEventsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 报警记录ID + */ + @ExcelProperty(value = "报警记录ID") + private Long id; + + /** + * 报警事件类型 + */ + @ExcelProperty(value = "报警事件类型") + private Long type; + + /** + * 报警记录级别(1:一般,2:中级,3:紧急) + */ + @ExcelProperty(value = "报警记录级别(1:一般,2:中级,3:紧急)") + private Long level; + + /** + * 报警设备ip + */ + @ExcelProperty(value = "报警设备ip") + private String deviceIp; + + /** + * 报警设备名称 + */ + @ExcelProperty(value = "报警设备名称") + private String deviceName; + + /** + * 设备所属区域id + */ + @ExcelProperty(value = "设备所属区域id") + private Long deviceGroupId; + + /** + * 设备所属区域名称 + */ + @ExcelProperty(value = "设备所属区域名称") + private String deviceGroupName; + + /** + * 设备告警时间 + */ + @ExcelProperty(value = "设备告警时间") + private Date reportTime; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java index 8661628c..02a76655 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java @@ -54,4 +54,5 @@ public class SisDeviceBindRefVo implements Serializable { private Integer controlType; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java index 8e093082..0ebdd583 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java @@ -43,6 +43,7 @@ public class SisElevatorFloorRefVo implements Serializable { @ExcelProperty(value = "楼层id") private Long floorId; + /** * 授权组id */ diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java index fadcb661..2d184e38 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java @@ -41,4 +41,6 @@ public class SisPersonLibVo implements Serializable { */ @ExcelProperty(value = "人员库描述") private String libDesc; + + private Integer libType; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventAttachmentsMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventAttachmentsMapper.java new file mode 100644 index 00000000..3a830a97 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventAttachmentsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sis.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.sis.domain.SisAlarmEventAttachments; +import org.dromara.sis.domain.vo.SisAlarmEventAttachmentsVo; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author mocheng + * @date 2025-08-04 + */ +public interface SisAlarmEventAttachmentsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventsMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventsMapper.java new file mode 100644 index 00000000..2aee9ab4 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAlarmEventsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sis.mapper; + +import org.dromara.sis.domain.SisAlarmEvents; +import org.dromara.sis.domain.vo.SisAlarmEventsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 告警Mapper接口 + * + * @author lxj + * @date 2025-08-04 + */ +public interface SisAlarmEventsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index 6feddeb9..13f27e41 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -1,21 +1,10 @@ package org.dromara.sis.sdk.hik.calback; -import cn.hutool.core.codec.Base64Encoder; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; import com.sun.jna.Pointer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.dubbo.config.annotation.DubboReference; -import org.dromara.property.api.RemoteFloorService; -import org.dromara.property.api.domain.vo.RemoteFloorVo; -import org.dromara.sis.domain.vo.*; -import org.dromara.sis.sdk.e8.E8PlatformApi; -import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq; import org.dromara.sis.sdk.hik.HCNetSDK; -import org.dromara.sis.sdk.hik.HikApiService; -import org.dromara.sis.sdk.huawei.HuaWeiBoxApi; -import org.dromara.sis.service.*; +import org.dromara.sis.service.IZeroSensationPassageService; import org.springframework.stereotype.Component; import java.io.FileNotFoundException; @@ -23,12 +12,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; -import java.util.Collection; import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static org.dromara.sis.sdk.hik.HCNetSDK.*; @@ -37,18 +21,7 @@ import static org.dromara.sis.sdk.hik.HCNetSDK.*; @RequiredArgsConstructor public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { - private final HuaWeiBoxApi huaWeiBoxApi; - private final ISisAuthRecordService authRecordService; - private final ISisElevatorInfoService elevatorInfoService; - private final ISisAuthGroupRefService authGroupRefService; - private final ISisDeviceBindRefService deviceBindRefService; - private final ISisAccessControlService accessControlService; - private final ISisElevatorFloorRefService elevatorFloorRefService; - private final E8PlatformApi e8PlatformApi; - - @DubboReference - private RemoteFloorService remoteFloorService; - + private final IZeroSensationPassageService zeroSensationPassageService; @Override public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { @@ -292,132 +265,23 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { * @return 返回是否处理成功 */ private boolean handleFaceSnap(HCNetSDK.NET_VCA_FACESNAP_RESULT result, HCNetSDK.NET_DVR_ALARMER pAlarmer) { - long s = System.currentTimeMillis(); // 读取人脸小图 ByteBuffer buffers = result.pBuffer1.getByteBuffer(0, result.dwFacePicLen); byte[] smallImg = new byte[result.dwFacePicLen]; buffers.rewind(); buffers.get(smallImg); - // 读取人脸大图 - /*ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen); - byte[] bigImg = new byte[result.dwBackgroundPicLen]; - buffers1.rewind(); - buffers1.get(bigImg);*/ - + // 人脸大图 + ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen); + byte[] bigImg = new byte[result.dwBackgroundPicLen]; + buffers1.rewind(); + buffers1.get(bigImg); //设备ip String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim(); - // 设备绑定关系 - List bindRefList = deviceBindRefService.queryByDeviceIp(sAlarmInfo); - if (CollUtil.isEmpty(bindRefList)) { - log.info("当前报警设备未绑定门禁/梯控,不做处理!"); - return true; - } - - // todo 进行人脸比对 - String smallImgBase64Str = Base64Encoder.encode(smallImg); - long s1 = System.currentTimeMillis(); - Long person = huaWeiBoxApi.findPerson(smallImgBase64Str); - log.info("人脸比对执行完成,耗时:{}", System.currentTimeMillis() - s1); - if (person == null) { - log.info("未命中人脸数据,暂不处理。"); - return true; - } - log.info("人脸比对完成,personId={}", person); - - // TODO 测试逻辑,只针对门禁 - - // 授权纪录 - SisAuthRecordVo authRecord = authRecordService.checkAuth(person); - if (authRecord == null) { - log.info("当前人脸未授权,暂不处理。"); - return true; - } - - Date now = new Date(); - if (DateUtil.compare(now, authRecord.getEndDate()) > 0) { - log.info("当前人脸已过期,暂不处理。"); - return true; - } - - // 授权设备列表 - List authGroupRefVos = authGroupRefService.queryListByGroupId(authRecord.getGroupId()); - // 获取门禁id - Collection acIds = authGroupRefVos.stream().filter(vo -> vo.getDeviceType() == 1).map(SisAuthGroupRefVo::getDeviceId).toList(); - if (CollUtil.isNotEmpty(acIds)) { - acIds.forEach(id -> { - // controlType 1-门禁 - Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id) && vo.getControlType() == 1).findFirst().map(SisDeviceBindRefVo::getBindId).orElse(null); - if (deviceId != null) { - SisAccessControlVo ac = accessControlService.queryById(deviceId); - log.info("调用门禁服务远程开门,doorName:{}", ac.getAccessName()); - RemoteOpenDoorReq req = new RemoteOpenDoorReq(); - req.setType(0); - RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData(); - data.setDeviceId(Long.parseLong(ac.getOutCode())); - data.setDoorId(Long.parseLong(ac.getOutCode())); - req.setControlList(List.of(data)); - Boolean flag = e8PlatformApi.remoteOpenDoor(req); - log.info("远程开门结果,result={}", flag); - } - }); - } - - - // 获取电梯ids - Collection eleIds = authGroupRefVos.stream().filter(vo -> vo.getDeviceType() == 2).map(SisAuthGroupRefVo::getDeviceId).toList(); - if (CollUtil.isNotEmpty(eleIds)) { - - // 创建线程池,处理关闭梯控 - int optimalPoolSize = Runtime.getRuntime().availableProcessors() + 1; - ExecutorService executor = Executors.newFixedThreadPool(optimalPoolSize); - - eleIds.forEach(id -> { - Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id) && vo.getControlType() != 1).findFirst().map(SisDeviceBindRefVo::getBindId).orElse(null); - if (deviceId != null) { - log.info("下发电梯权限"); - // 获取电梯信息 - SisElevatorInfoVo ele = elevatorInfoService.queryById(deviceId); - // 根据单元ID获取楼层信息 - List floorInfo = remoteFloorService.queryByUnitId(deviceId); - // 获取电梯⇄楼层关联信息 - List floorRefList = elevatorFloorRefService.queryByAuthGroupId(authRecord.getGroupId()); - // 获取楼层数组 - List layerArray = floorInfo.stream().map(RemoteFloorVo::getId).sorted().toList(); - - layerArray.forEach(layer -> { - SisElevatorFloorRefVo floorRef = floorRefList.stream() - .filter(vo -> Objects.equals(vo.getFloorId(), layer)) // 直接使用 layer - .findFirst() - .orElse(null); - if (floorRef == null) { - HikApiService.getInstance().controlGateway(ele.getControlIp(), layer.intValue(), 3); - } else { - HikApiService.getInstance().controlGateway(ele.getControlIp(), layer.intValue(), 2); - } - }); - - // todo 做延时队列,关闭梯控授权 - // 提交任务到线程池 - executor.execute(() -> { - try { - // 5秒后清除权限 - Thread.sleep(5000L); - for (int i = 0; i < layerArray.size(); i++) { - HikApiService.getInstance().controlGateway(ele.getControlIp(), (i + 1), 3); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - - } - }); - - // 关闭线程池 - executor.shutdown(); - } - log.info("权限下发执行完成,耗时:{}", System.currentTimeMillis() - s); + log.info("海康设备告警信息上传,设备={}, 人脸图片大小={}, 背景图片大小={}", sAlarmInfo, smallImg.length, bigImg.length); + zeroSensationPassageService.pass(sAlarmInfo, smallImg, bigImg); return false; } + + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventAttachmentsService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventAttachmentsService.java new file mode 100644 index 00000000..89feccd8 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventAttachmentsService.java @@ -0,0 +1,68 @@ +package org.dromara.sis.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.domain.bo.SisAlarmEventAttachmentsBo; +import org.dromara.sis.domain.vo.SisAlarmEventAttachmentsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author mocheng + * @date 2025-08-04 + */ +public interface ISisAlarmEventAttachmentsService { + + /** + * 查询【请填写功能名称】 + * + * @param id 主键 + * @return 【请填写功能名称】 + */ + SisAlarmEventAttachmentsVo queryById(Long id); + + /** + * 分页查询【请填写功能名称】列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 【请填写功能名称】分页列表 + */ + TableDataInfo queryPageList(SisAlarmEventAttachmentsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的【请填写功能名称】列表 + * + * @param bo 查询条件 + * @return 【请填写功能名称】列表 + */ + List queryList(SisAlarmEventAttachmentsBo bo); + + /** + * 新增【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否新增成功 + */ + Boolean insertByBo(SisAlarmEventAttachmentsBo bo); + + /** + * 修改【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否修改成功 + */ + Boolean updateByBo(SisAlarmEventAttachmentsBo bo); + + /** + * 校验并批量删除【请填写功能名称】信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java new file mode 100644 index 00000000..02eecf4a --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java @@ -0,0 +1,69 @@ +package org.dromara.sis.service; + +import org.dromara.sis.domain.SisAlarmEvents; +import org.dromara.sis.domain.vo.SisAlarmEventsVo; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 告警Service接口 + * + * @author lxj + * @date 2025-08-04 + */ +public interface ISisAlarmEventsService { + + /** + * 查询告警 + * + * @param id 主键 + * @return 告警 + */ + SisAlarmEventsVo queryById(Long id); + + /** + * 分页查询告警列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 告警分页列表 + */ + TableDataInfo queryPageList(SisAlarmEventsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的告警列表 + * + * @param bo 查询条件 + * @return 告警列表 + */ + List queryList(SisAlarmEventsBo bo); + + /** + * 新增告警 + * + * @param bo 告警 + * @return 是否新增成功 + */ + Boolean insertByBo(SisAlarmEventsBo bo); + + /** + * 修改告警 + * + * @param bo 告警 + * @return 是否修改成功 + */ + Boolean updateByBo(SisAlarmEventsBo bo); + + /** + * 校验并批量删除告警信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/IZeroSensationPassageService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/IZeroSensationPassageService.java new file mode 100644 index 00000000..09de1825 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/IZeroSensationPassageService.java @@ -0,0 +1,14 @@ +package org.dromara.sis.service; + +public interface IZeroSensationPassageService { + + /** + * 无感通行服务 + * + * @param deviceIp 设备ip + * @param smallImp 人脸小图 + * @param bigImg 背景图片 + */ + void pass(String deviceIp, byte[] smallImp, byte[] bigImg); + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventAttachmentsServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventAttachmentsServiceImpl.java new file mode 100644 index 00000000..b3da1c3f --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventAttachmentsServiceImpl.java @@ -0,0 +1,134 @@ +package org.dromara.sis.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.domain.SisAlarmEventAttachments; +import org.dromara.sis.domain.bo.SisAlarmEventAttachmentsBo; +import org.dromara.sis.domain.vo.SisAlarmEventAttachmentsVo; +import org.dromara.sis.mapper.SisAlarmEventAttachmentsMapper; +import org.dromara.sis.service.ISisAlarmEventAttachmentsService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author mocheng + * @date 2025-08-04 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SisAlarmEventAttachmentsServiceImpl implements ISisAlarmEventAttachmentsService { + + private final SisAlarmEventAttachmentsMapper baseMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 主键 + * @return 【请填写功能名称】 + */ + @Override + public SisAlarmEventAttachmentsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询【请填写功能名称】列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 【请填写功能名称】分页列表 + */ + @Override + public TableDataInfo queryPageList(SisAlarmEventAttachmentsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的【请填写功能名称】列表 + * + * @param bo 查询条件 + * @return 【请填写功能名称】列表 + */ + @Override + public List queryList(SisAlarmEventAttachmentsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SisAlarmEventAttachmentsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SisAlarmEventAttachments::getId); + lqw.eq(bo.getEventId() != null, SisAlarmEventAttachments::getEventId, bo.getEventId()); + lqw.eq(StringUtils.isNotBlank(bo.getOssId()), SisAlarmEventAttachments::getOssId, bo.getOssId()); + lqw.eq(bo.getType() != null, SisAlarmEventAttachments::getType, bo.getType()); + return lqw; + } + + /** + * 新增【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SisAlarmEventAttachmentsBo bo) { + SisAlarmEventAttachments add = MapstructUtils.convert(bo, SisAlarmEventAttachments.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SisAlarmEventAttachmentsBo bo) { + SisAlarmEventAttachments update = MapstructUtils.convert(bo, SisAlarmEventAttachments.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SisAlarmEventAttachments entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除【请填写功能名称】信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java new file mode 100644 index 00000000..0ce2b341 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java @@ -0,0 +1,138 @@ +package org.dromara.sis.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.sis.domain.vo.SisAlarmEventsVo; +import org.dromara.sis.domain.SisAlarmEvents; +import org.dromara.sis.mapper.SisAlarmEventsMapper; +import org.dromara.sis.service.ISisAlarmEventsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 告警Service业务层处理 + * + * @author lxj + * @date 2025-08-04 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { + + private final SisAlarmEventsMapper baseMapper; + + /** + * 查询告警 + * + * @param id 主键 + * @return 告警 + */ + @Override + public SisAlarmEventsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询告警列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 告警分页列表 + */ + @Override + public TableDataInfo queryPageList(SisAlarmEventsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的告警列表 + * + * @param bo 查询条件 + * @return 告警列表 + */ + @Override + public List queryList(SisAlarmEventsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SisAlarmEventsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SisAlarmEvents::getId); + lqw.eq(bo.getType() != null, SisAlarmEvents::getType, bo.getType()); + lqw.eq(bo.getLevel() != null, SisAlarmEvents::getLevel, bo.getLevel()); + lqw.eq(StringUtils.isNotBlank(bo.getDeviceIp()), SisAlarmEvents::getDeviceIp, bo.getDeviceIp()); + lqw.like(StringUtils.isNotBlank(bo.getDeviceName()), SisAlarmEvents::getDeviceName, bo.getDeviceName()); + lqw.eq(bo.getDeviceGroupId() != null, SisAlarmEvents::getDeviceGroupId, bo.getDeviceGroupId()); + lqw.like(StringUtils.isNotBlank(bo.getDeviceGroupName()), SisAlarmEvents::getDeviceGroupName, bo.getDeviceGroupName()); + lqw.eq(bo.getReportTime() != null, SisAlarmEvents::getReportTime, bo.getReportTime()); + return lqw; + } + + /** + * 新增告警 + * + * @param bo 告警 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SisAlarmEventsBo bo) { + SisAlarmEvents add = MapstructUtils.convert(bo, SisAlarmEvents.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改告警 + * + * @param bo 告警 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SisAlarmEventsBo bo) { + SisAlarmEvents update = MapstructUtils.convert(bo, SisAlarmEvents.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SisAlarmEvents entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除告警信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java new file mode 100644 index 00000000..3bfea6fc --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java @@ -0,0 +1,155 @@ +package org.dromara.sis.service.impl; + +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.TimeInterval; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.property.api.RemoteFloorService; +import org.dromara.property.api.domain.vo.RemoteFloorVo; +import org.dromara.sis.domain.vo.*; +import org.dromara.sis.sdk.e8.E8PlatformApi; +import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq; +import org.dromara.sis.sdk.huawei.HuaWeiBoxApi; +import org.dromara.sis.service.*; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 无感通行业务服务实现 + * + * @author lxj, lsm + * @since 2025-08-04 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageService { + + private final HuaWeiBoxApi huaWeiBoxApi; + private final ISisAuthRecordService authRecordService; + private final ISisElevatorInfoService elevatorInfoService; + private final ISisAuthGroupRefService authGroupRefService; + private final ISisDeviceBindRefService deviceBindRefService; + private final ISisAccessControlService accessControlService; + private final ISisElevatorFloorRefService elevatorFloorRefService; + private final E8PlatformApi e8PlatformApi; + private final ISisAlarmEventsService alarmEventsService; + + @DubboReference + private RemoteFloorService remoteFloorService; + + @Override + public void pass(String deviceIp, byte[] smallImg, byte[] bigImg) { + TimeInterval interval = new TimeInterval(); + // 抓拍小图 + String smallImgBase64Str = Base64Encoder.encode(smallImg); + Long person = huaWeiBoxApi.findPerson(smallImgBase64Str); + log.info("人脸比对执行完成,耗时:{}ms", interval); + if (person == null) { + log.info("未命中人脸数据,暂不处理。"); + return; + } + // 验证当前人原是否存在授权记录 + SisAuthRecordVo authRecord = authRecordService.checkAuth(person); + log.info("查询人员权限记录完成,耗时={}ms", interval.interval()); + if (authRecord == null) { + // todo 产生高危告警记录 + log.info("当前人脸未授权,暂不处理。"); + return; + } + Date now = new Date(); + if (DateUtil.compare(now, authRecord.getEndDate()) > 0) { + // todo 生成一般告警记录 + log.info("当前人脸已过期,暂不处理。"); + return; + } + + // 获取当前设备的绑定设备信息 + List bindRefList = deviceBindRefService.queryByDeviceIp(deviceIp); + log.info("查询设备绑定的梯控/门禁完成,耗时={}ms", interval.interval()); + if (CollUtil.isEmpty(bindRefList)) { + log.info("当前报警设备未绑定门禁/梯控,不做处理!"); + return; + } + // 授权设备列表 + List authGroupRefVos = authGroupRefService.queryListByGroupId(authRecord.getGroupId()); + // 验证当前设备的绑定门禁和梯控是否有使用权限 + bindRefList.forEach(item -> { + SisAuthGroupRefVo r = null; + for (SisAuthGroupRefVo ref : authGroupRefVos) { + if (Objects.equals(item.getBindId(), ref.getDeviceId())) { + r = ref; + break; + } + } + if (r == null) { + log.info("人员[{}]不存在门禁/电梯[{}]的通行权限", person, item.getBindId()); + return; + } + // 判断绑定设备类型,走不同的处理方法 + if (item.getControlType() == 1) { // 门禁 + handleAc(item.getDeviceId()); + } else if (item.getControlType() == 2) { // 电梯外面面板权限 + handleEle(item.getDeviceId(), r.getAuthGroupId(), 2); + } else if (item.getControlType() == 3) { // 电梯里面的面板 + handleEle(item.getDeviceId(), r.getAuthGroupId(), 3); + } else { + log.info("设备绑定了未知的控制类型[{}],不处理", item.getControlType()); + } + }); + log.info("权限下发执行完成,耗时:{}ms", interval.interval()); + } + + /** + * 生成告警事件 + */ + public void createAlarmRecord() { + + + } + + /** + * 处理门禁 + */ + public void handleAc(Long deviceId) { + if (deviceId != null) { + SisAccessControlVo ac = accessControlService.queryById(deviceId); + log.info("调用门禁服务远程开门,doorName:{}", ac.getAccessName()); + RemoteOpenDoorReq req = new RemoteOpenDoorReq(); + req.setType(0); + RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData(); + data.setDeviceId(Long.parseLong(ac.getOutCode())); + data.setDoorId(Long.parseLong(ac.getOutCode())); + req.setControlList(List.of(data)); + Boolean flag = e8PlatformApi.remoteOpenDoor(req); + log.info("远程开门结果,result={}", flag); + } + } + + /** + * 验证电梯权限 + */ + public void handleEle(Long deviceId, Long groupId, Integer controlType) { + log.info("开始下发梯控权限...."); + // 获取电梯信息 + // 获取电梯信息 + SisElevatorInfoVo ele = elevatorInfoService.queryById(deviceId); + // 根据单元ID获取楼层信息 + List floorInfo = remoteFloorService.queryByUnitId(deviceId); + // 获取电梯⇄楼层关联信息 + List floorRefList = elevatorFloorRefService.queryByAuthGroupId(groupId); + + for (SisElevatorFloorRefVo sisElevatorFloorRefVo : floorRefList) { + //todo 下发梯控权限 +// HikApiService.getInstance().controlGateway(ele.getControlIp(), sisElevatorFloorRefVo.getFloorId(), 2); + } + + + } +} diff --git a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventAttachmentsMapper.xml b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventAttachmentsMapper.xml new file mode 100644 index 00000000..440c5218 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventAttachmentsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventsMapper.xml b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventsMapper.xml new file mode 100644 index 00000000..fe53102b --- /dev/null +++ b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAlarmEventsMapper.xml @@ -0,0 +1,7 @@ + + + + +