增加无感通行业务逻辑
This commit is contained in:
parent
c66c81b434
commit
7f76de6073
@ -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<SisAlarmEventAttachmentsVo> 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<SisAlarmEventAttachmentsVo> list = sisAlarmEventAttachmentsService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "【请填写功能名称】", SisAlarmEventAttachmentsVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取【请填写功能名称】详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("system:alarmEventAttachments:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<SisAlarmEventAttachmentsVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable("ids") Long[] ids) {
|
||||
return toAjax(sisAlarmEventAttachmentsService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
@ -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<SisAlarmEventsVo> 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<SisAlarmEventsVo> list = sisAlarmEventsService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "告警", SisAlarmEventsVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取告警详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("sis:alarmEvents:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<SisAlarmEventsVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable("ids") Long[] ids) {
|
||||
return toAjax(sisAlarmEventsService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -37,4 +37,9 @@ public class SisPersonLib extends TenantEntity {
|
||||
* 人员库描述
|
||||
*/
|
||||
private String libDesc;
|
||||
|
||||
/**
|
||||
* 1:白名单,2:黑名单,3:红名单l
|
||||
*/
|
||||
private Integer libType;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -36,4 +36,7 @@ public class SisPersonLibBo extends BaseEntity {
|
||||
* 人员库描述
|
||||
*/
|
||||
private String libDesc;
|
||||
|
||||
private Integer libType;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -54,4 +54,5 @@ public class SisDeviceBindRefVo implements Serializable {
|
||||
private Integer controlType;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ public class SisElevatorFloorRefVo implements Serializable {
|
||||
@ExcelProperty(value = "楼层id")
|
||||
private Long floorId;
|
||||
|
||||
|
||||
/**
|
||||
* 授权组id
|
||||
*/
|
||||
|
@ -41,4 +41,6 @@ public class SisPersonLibVo implements Serializable {
|
||||
*/
|
||||
@ExcelProperty(value = "人员库描述")
|
||||
private String libDesc;
|
||||
|
||||
private Integer libType;
|
||||
}
|
||||
|
@ -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<SisAlarmEventAttachments, SisAlarmEventAttachmentsVo> {
|
||||
|
||||
}
|
@ -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<SisAlarmEvents, SisAlarmEventsVo> {
|
||||
|
||||
}
|
@ -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);
|
||||
// 人脸大图
|
||||
ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen);
|
||||
byte[] bigImg = new byte[result.dwBackgroundPicLen];
|
||||
buffers1.rewind();
|
||||
buffers1.get(bigImg);*/
|
||||
|
||||
buffers1.get(bigImg);
|
||||
//设备ip
|
||||
String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
|
||||
// 设备绑定关系
|
||||
List<SisDeviceBindRefVo> 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<SisAuthGroupRefVo> authGroupRefVos = authGroupRefService.queryListByGroupId(authRecord.getGroupId());
|
||||
// 获取门禁id
|
||||
Collection<Long> 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<Long> 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<RemoteFloorVo> floorInfo = remoteFloorService.queryByUnitId(deviceId);
|
||||
// 获取电梯⇄楼层关联信息
|
||||
List<SisElevatorFloorRefVo> floorRefList = elevatorFloorRefService.queryByAuthGroupId(authRecord.getGroupId());
|
||||
// 获取楼层数组
|
||||
List<Long> 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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<SisAlarmEventAttachmentsVo> queryPageList(SisAlarmEventAttachmentsBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的【请填写功能名称】列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 【请填写功能名称】列表
|
||||
*/
|
||||
List<SisAlarmEventAttachmentsVo> 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<Long> ids, Boolean isValid);
|
||||
}
|
@ -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<SisAlarmEventsVo> queryPageList(SisAlarmEventsBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的告警列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 告警列表
|
||||
*/
|
||||
List<SisAlarmEventsVo> 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<Long> ids, Boolean isValid);
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -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<SisAlarmEventAttachmentsVo> queryPageList(SisAlarmEventAttachmentsBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<SisAlarmEventAttachments> lqw = buildQueryWrapper(bo);
|
||||
Page<SisAlarmEventAttachmentsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的【请填写功能名称】列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 【请填写功能名称】列表
|
||||
*/
|
||||
@Override
|
||||
public List<SisAlarmEventAttachmentsVo> queryList(SisAlarmEventAttachmentsBo bo) {
|
||||
LambdaQueryWrapper<SisAlarmEventAttachments> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<SisAlarmEventAttachments> buildQueryWrapper(SisAlarmEventAttachmentsBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<SisAlarmEventAttachments> 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<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
@ -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<SisAlarmEventsVo> queryPageList(SisAlarmEventsBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<SisAlarmEvents> lqw = buildQueryWrapper(bo);
|
||||
Page<SisAlarmEventsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的告警列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 告警列表
|
||||
*/
|
||||
@Override
|
||||
public List<SisAlarmEventsVo> queryList(SisAlarmEventsBo bo) {
|
||||
LambdaQueryWrapper<SisAlarmEvents> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<SisAlarmEvents> buildQueryWrapper(SisAlarmEventsBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<SisAlarmEvents> 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<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
@ -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<SisDeviceBindRefVo> bindRefList = deviceBindRefService.queryByDeviceIp(deviceIp);
|
||||
log.info("查询设备绑定的梯控/门禁完成,耗时={}ms", interval.interval());
|
||||
if (CollUtil.isEmpty(bindRefList)) {
|
||||
log.info("当前报警设备未绑定门禁/梯控,不做处理!");
|
||||
return;
|
||||
}
|
||||
// 授权设备列表
|
||||
List<SisAuthGroupRefVo> 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<RemoteFloorVo> floorInfo = remoteFloorService.queryByUnitId(deviceId);
|
||||
// 获取电梯⇄楼层关联信息
|
||||
List<SisElevatorFloorRefVo> floorRefList = elevatorFloorRefService.queryByAuthGroupId(groupId);
|
||||
|
||||
for (SisElevatorFloorRefVo sisElevatorFloorRefVo : floorRefList) {
|
||||
//todo 下发梯控权限
|
||||
// HikApiService.getInstance().controlGateway(ele.getControlIp(), sisElevatorFloorRefVo.getFloorId(), 2);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.dromara.sis.mapper.SisAlarmEventAttachmentsMapper">
|
||||
|
||||
</mapper>
|
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.dromara.sis.mapper.SisAlarmEventsMapper">
|
||||
|
||||
</mapper>
|
Loading…
Reference in New Issue
Block a user