增加设备和门禁的关联关系

This commit is contained in:
lxj 2025-08-06 12:35:22 +08:00
parent 2a36ddf688
commit 70fe6d713a
18 changed files with 561 additions and 87 deletions

View File

@ -5,17 +5,14 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.domain.TreeNode;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.property.api.RemoteFloorService;
import org.dromara.property.api.domain.vo.RemoteFloorVo;
import org.dromara.property.domain.vo.TbBuildingVo;
import org.dromara.property.domain.vo.TbCommunityVo;
import org.dromara.property.domain.vo.TbFloorVo;
import org.dromara.property.domain.vo.TbUnitVo;
import org.dromara.property.service.ITbBuildingService;
import org.dromara.property.service.ITbCommunityService;
import org.dromara.property.service.ITbFloorService;
import org.dromara.property.service.ITbUnitService;
import java.util.ArrayList;
import java.util.List;
@ -32,7 +29,6 @@ public class RemoteFloorServiceImpl implements RemoteFloorService {
private final ITbCommunityService tbCommunityService;
private final ITbBuildingService tbBuildingService;
private final ITbUnitService unitService;
private final ITbFloorService floorService;
@Override
@ -72,20 +68,6 @@ public class RemoteFloorServiceImpl implements RemoteFloorService {
return node;
}).toList();
treeList.addAll(l2);
List<TbUnitVo> tbUnitVos = unitService.queryAll();
if (tbUnitVos == null || tbUnitVos.isEmpty()) {
return treeList;
}
List<TreeNode<Long>> l3 = tbUnitVos.stream().map(item -> {
TreeNode<Long> node = new TreeNode<>();
node.setLevel(3);
node.setCode(item.getId());
node.setParentCode(item.getBuildingId());
node.setLabel(item.getUnitName());
return node;
}).toList();
treeList.addAll(l3);
List<TbFloorVo> tbFloorVos = floorService.queryAll();
if (tbFloorVos == null || tbFloorVos.isEmpty()) {
return treeList;
@ -94,7 +76,7 @@ public class RemoteFloorServiceImpl implements RemoteFloorService {
TreeNode<Long> node = new TreeNode<>();
node.setLevel(4);
node.setCode(item.getId());
node.setParentCode(item.getUnitId());
node.setParentCode(item.getBuildingId());
node.setLabel(item.getFloorName());
return node;
}).toList();
@ -109,7 +91,7 @@ public class RemoteFloorServiceImpl implements RemoteFloorService {
* @return 楼层
*/
@Override
public List<RemoteFloorVo> queryByBuildingId(Long buildingId){
public List<RemoteFloorVo> queryByBuildingId(Long buildingId) {
List<TbFloorVo> tbFloorVo = floorService.queryByBuildingId(buildingId);
List<RemoteFloorVo> remoteFloorVos = new ArrayList<>();

View File

@ -0,0 +1,40 @@
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.io.Serial;
/**
* 门禁监控点关联对象 sis_ac_device_ref
*
* @author lxj
* @date 2025-08-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sis_ac_device_ref")
public class SisAcDeviceRef extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 门禁设备id
*/
private Long acId;
/**
* 监控点设备id
*/
private Long dpId;
}

View File

@ -0,0 +1,42 @@
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.SisAcDeviceRef;
/**
* 门禁监控点关联业务对象 sis_ac_device_ref
*
* @author lxj
* @date 2025-08-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SisAcDeviceRef.class, reverseConvertGenerate = false)
public class SisAcDeviceRefBo extends BaseEntity {
/**
*
*/
@NotNull(message = "不能为空", groups = {EditGroup.class})
private Long id;
/**
* 门禁设备id
*/
@NotNull(message = "门禁设备id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long acId;
/**
* 监控点设备id
*/
@NotNull(message = "监控点设备id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long dpId;
}

View File

@ -10,6 +10,8 @@ import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.sis.domain.SisAccessControl;
import java.util.List;
/**
* 门禁设备业务对象 sis_access_control
*
@ -104,4 +106,9 @@ public class SisAccessControlBo extends BaseEntity {
*/
private Long bindDeviceId;
/**
* 监控点列表
*/
private List<Long> devicePoint;
}

View File

@ -0,0 +1,13 @@
package org.dromara.sis.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.sis.domain.SisDeviceManage;
@EqualsAndHashCode(callSuper = true)
@Data
public class SisAcDevice extends SisDeviceManage {
private Long acId;
}

View File

@ -0,0 +1,50 @@
package org.dromara.sis.domain.vo;
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 org.dromara.sis.domain.SisAcDeviceRef;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 门禁监控点关联视图对象 sis_ac_device_ref
*
* @author lxj
* @date 2025-08-05
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = SisAcDeviceRef.class)
public class SisAcDeviceRefVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 门禁设备id
*/
@ExcelProperty(value = "门禁设备id")
private Long acId;
/**
* 监控点设备id
*/
@ExcelProperty(value = "监控点设备id")
private Long dpId;
}

View File

@ -1,35 +1,35 @@
package org.dromara.sis.dubbo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.sis.api.RemotePrecautionary;
import org.dromara.sis.api.domain.RemotePrecautionaryVo;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
@Slf4j
@DubboService
@RequiredArgsConstructor
public class RemotePrecautionaryImpl implements RemotePrecautionary {
private final PrecautionaryMapper precautionaryMapper;
@Override
public List<RemotePrecautionaryVo> getList() {
Page<Precautionary> Page = new Page<>(1, 10);
QueryWrapper<Precautionary> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("time");
return precautionaryMapper.selectVoPage(Page, wrapper);
}
@Override
public Map count() {
List<Precautionary> precautionaries = precautionaryMapper.selectList();
Stream<Long> longStream = precautionaries.stream().map(Precautionary::getType);
return Map.of();
}
}
//package org.dromara.sis.dubbo;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.dubbo.config.annotation.DubboService;
//import org.dromara.sis.api.RemotePrecautionary;
//import org.dromara.sis.api.domain.RemotePrecautionaryVo;
//
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Stream;
//
//@Slf4j
//@DubboService
//@RequiredArgsConstructor
//public class RemotePrecautionaryImpl implements RemotePrecautionary {
// private final PrecautionaryMapper precautionaryMapper;
//
// @Override
// public List<RemotePrecautionaryVo> getList() {
// Page<Precautionary> Page = new Page<>(1, 10);
// QueryWrapper<Precautionary> wrapper = new QueryWrapper<>();
// wrapper.orderByAsc("time");
// return precautionaryMapper.selectVoPage(Page, wrapper);
// }
//
// @Override
// public Map count() {
// List<Precautionary> precautionaries = precautionaryMapper.selectList();
// Stream<Long> longStream = precautionaries.stream().map(Precautionary::getType);
// return Map.of();
// }
//}

View File

@ -0,0 +1,25 @@
package org.dromara.sis.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.sis.domain.SisAcDeviceRef;
import org.dromara.sis.domain.model.SisAcDevice;
import org.dromara.sis.domain.vo.SisAcDeviceRefVo;
import java.util.List;
/**
* 门禁监控点关联Mapper接口
*
* @author lxj
* @date 2025-08-05
*/
public interface SisAcDeviceRefMapper extends BaseMapperPlus<SisAcDeviceRef, SisAcDeviceRefVo> {
/**
* 通过门禁id列表查询设备信息
*
* @param acIds 门禁设备id
* @return 查询数据
*/
List<SisAcDevice> queryByAcIds(List<Long> acIds);
}

View File

@ -36,5 +36,5 @@ public interface HuaWeiBoxApi {
* @param base64Img 入参
* @return Map<String, Object>
*/
HWResult findPerson(String base64Img);
HWResult<Long> findPerson(String base64Img);
}

View File

@ -10,9 +10,12 @@ import lombok.Data;
*/
@Data
@AllArgsConstructor
public class HWResult {
public class HWResult<T> {
public Integer code;
public String message;
public T data;
}

View File

@ -13,9 +13,7 @@ import org.dromara.sis.sdk.huawei.utils.HuaWeiHttp;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -89,7 +87,7 @@ public class HuaWeiBoxApiService implements HuaWeiBoxApi {
* @return Long
*/
@Override
public HWResult findPerson(String base64Img) {
public HWResult<Long> findPerson(String base64Img) {
String url = "/sdk_service/rest/facerepositories/peoples";
FinaHWPersonReq req = new FinaHWPersonReq();
@ -103,9 +101,9 @@ public class HuaWeiBoxApiService implements HuaWeiBoxApi {
if (jsonRes.getInt("resultCode") != 0) {
return switch (jsonRes.getInt("resultCode")) {
case 912322041 -> new HWResult(912322041, "特征值提取失败");
case 912333003 -> new HWResult(912333003, "base64参数非法");
default -> new HWResult(jsonRes.getInt("resultCode"), jsonRes.getStr("resultMsg"));
case 912322041 -> new HWResult<>(912322041, "特征值提取失败", 0L);
case 912333003 -> new HWResult<>(912333003, "base64参数非法", 0L);
default -> new HWResult<>(jsonRes.getInt("resultCode"), jsonRes.getStr("resultMsg"), 0L);
};
}
@ -114,12 +112,12 @@ public class HuaWeiBoxApiService implements HuaWeiBoxApi {
if (Integer.parseInt(obj.getStr("number")) == 0) {
log.info("无人脸比对数据");
return new HWResult(201, "匹配数据");
return new HWResult<>(201, "人脸比对数据", 0L);
}
JSONArray peopleList = obj.getJSONArray("peopleList");
JSONObject people = peopleList.getJSONObject(0);
return new HWResult(200, people.getStr("peopleId"));
return new HWResult<>(200, "ok", people.getLong("peopleId"));
}
}

View File

@ -0,0 +1,94 @@
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.SisAcDeviceRef;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.domain.bo.SisAcDeviceRefBo;
import org.dromara.sis.domain.model.SisAcDevice;
import org.dromara.sis.domain.vo.SisAcDeviceRefVo;
import java.util.Collection;
import java.util.List;
/**
* 门禁监控点关联Service接口
*
* @author lxj
* @date 2025-08-05
*/
public interface ISisAcDeviceRefService {
/**
* 查询门禁监控点关联
*
* @param id 主键
* @return 门禁监控点关联
*/
SisAcDeviceRefVo queryById(Long id);
/**
* 分页查询门禁监控点关联列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 门禁监控点关联分页列表
*/
TableDataInfo<SisAcDeviceRefVo> queryPageList(SisAcDeviceRefBo bo, PageQuery pageQuery);
/**
* 查询符合条件的门禁监控点关联列表
*
* @param bo 查询条件
* @return 门禁监控点关联列表
*/
List<SisAcDeviceRefVo> queryList(SisAcDeviceRefBo bo);
/**
* 新增门禁监控点关联
*
* @param bo 门禁监控点关联
* @return 是否新增成功
*/
Boolean insertByBo(SisAcDeviceRefBo bo);
/**
* 修改门禁监控点关联
*
* @param bo 门禁监控点关联
* @return 是否修改成功
*/
Boolean updateByBo(SisAcDeviceRefBo bo);
/**
* 校验并批量删除门禁监控点关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 通过 门禁设备id 删除 门禁和设备的关联关系
*
* @param acId 门禁设备id
* @return 是否删除成功
*/
Boolean deleteByAcId(Long acId);
/**
* 批量写入关联关系
*
* @param refs 写入数据
* @return 返回是否写入成功
*/
Boolean batchInsert(List<SisAcDeviceRef> refs);
/**
* 通过acids查询关联记录
* @param acIds 门禁id列表
* @return 返回查询数据
*/
List<SisAcDevice> queryByAcIds(List<Long> acIds);
}

View File

@ -69,6 +69,6 @@ public interface ISisAlarmEventsService {
/**
* 异步生成告警记录
*/
void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg);
void createAlarmRecord(String deviceIp, Integer level, Integer type, String msg, byte[] smallImg, byte[] bigImg);
}

View File

@ -0,0 +1,151 @@
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.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.sis.domain.SisAcDeviceRef;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.domain.bo.SisAcDeviceRefBo;
import org.dromara.sis.domain.model.SisAcDevice;
import org.dromara.sis.domain.vo.SisAcDeviceRefVo;
import org.dromara.sis.mapper.SisAcDeviceRefMapper;
import org.dromara.sis.service.ISisAcDeviceRefService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 门禁监控点关联Service业务层处理
*
* @author lxj
* @date 2025-08-05
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class SisAcDeviceRefServiceImpl implements ISisAcDeviceRefService {
private final SisAcDeviceRefMapper baseMapper;
/**
* 查询门禁监控点关联
*
* @param id 主键
* @return 门禁监控点关联
*/
@Override
public SisAcDeviceRefVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询门禁监控点关联列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 门禁监控点关联分页列表
*/
@Override
public TableDataInfo<SisAcDeviceRefVo> queryPageList(SisAcDeviceRefBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SisAcDeviceRef> lqw = buildQueryWrapper(bo);
Page<SisAcDeviceRefVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的门禁监控点关联列表
*
* @param bo 查询条件
* @return 门禁监控点关联列表
*/
@Override
public List<SisAcDeviceRefVo> queryList(SisAcDeviceRefBo bo) {
LambdaQueryWrapper<SisAcDeviceRef> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<SisAcDeviceRef> buildQueryWrapper(SisAcDeviceRefBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SisAcDeviceRef> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(SisAcDeviceRef::getId);
lqw.eq(bo.getAcId() != null, SisAcDeviceRef::getAcId, bo.getAcId());
lqw.eq(bo.getDpId() != null, SisAcDeviceRef::getDpId, bo.getDpId());
return lqw;
}
/**
* 新增门禁监控点关联
*
* @param bo 门禁监控点关联
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(SisAcDeviceRefBo bo) {
SisAcDeviceRef add = MapstructUtils.convert(bo, SisAcDeviceRef.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改门禁监控点关联
*
* @param bo 门禁监控点关联
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(SisAcDeviceRefBo bo) {
SisAcDeviceRef update = MapstructUtils.convert(bo, SisAcDeviceRef.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(SisAcDeviceRef entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除门禁监控点关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public Boolean deleteByAcId(Long acId) {
LambdaQueryWrapper<SisAcDeviceRef> lqw = Wrappers.lambdaQuery();
lqw.eq(SisAcDeviceRef::getAcId, acId);
return baseMapper.delete(lqw) > 0;
}
@Override
public Boolean batchInsert(List<SisAcDeviceRef> refs) {
return baseMapper.insertBatch(refs);
}
@Override
public List<SisAcDevice> queryByAcIds(List<Long> acIds) {
return baseMapper.queryByAcIds(acIds);
}
}

View File

@ -1,5 +1,6 @@
package org.dromara.sis.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -15,15 +16,18 @@ import org.dromara.common.core.utils.TreeUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.property.api.RemoteFloorService;
import org.dromara.sis.domain.SisAcDeviceRef;
import org.dromara.sis.domain.SisAccessControl;
import org.dromara.sis.domain.SisDeviceBindRef;
import org.dromara.sis.domain.bo.SisAccessControlBo;
import org.dromara.sis.domain.enums.ControlTypeEnum;
import org.dromara.sis.domain.model.SisAcDevice;
import org.dromara.sis.domain.vo.SisAccessControlVo;
import org.dromara.sis.domain.vo.SisDeviceManageVo;
import org.dromara.sis.mapper.SisAccessControlMapper;
import org.dromara.sis.sdk.e8.E8PlatformApi;
import org.dromara.sis.sdk.e8.domain.door.res.AuthDoorDeviceFindRes;
import org.dromara.sis.service.ISisAcDeviceRefService;
import org.dromara.sis.service.ISisAccessControlService;
import org.dromara.sis.service.ISisDeviceBindRefService;
import org.dromara.sis.service.ISisDeviceManageService;
@ -50,6 +54,8 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
private final E8PlatformApi e8PlatformApi;
private final ISisDeviceManageService sisDeviceManageService;
private final ISisDeviceBindRefService sisDeviceBindRefService;
private final ISisAcDeviceRefService sisAcDeviceRefService;
@DubboReference
private RemoteFloorService remoteFloorService;
@ -133,21 +139,45 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(SisAccessControlBo bo) {
SisAccessControl update = MapstructUtils.convert(bo, SisAccessControl.class);
sisDeviceBindRefService.deleteByBindId(bo.getId());
boolean b = baseMapper.updateById(update) > 0;
if (bo.getBindDeviceId() != null) {
// 检验设备是否存在
SisDeviceManageVo sisDeviceManageVo = sisDeviceManageService.queryById(bo.getBindDeviceId());
Assert.isTrue(sisDeviceManageVo != null, "设备-{}信息不存在.", bo.getBindDeviceId());
// 写入关联关系表中
SisDeviceBindRef sisDeviceBindRef = new SisDeviceBindRef();
sisDeviceBindRef.setDeviceId(sisDeviceManageVo.getId());
sisDeviceBindRef.setDeviceIp(sisDeviceManageVo.getDeviceIp());
sisDeviceBindRef.setBindId(bo.getId());
sisDeviceBindRef.setControlType(ControlTypeEnum.ACCESS_CONTROL.getCode());
// 删除绑定关系
sisDeviceBindRefService.deleteByBindId(bo.getId());
// 重新构建绑定关系
Boolean insert = sisDeviceBindRefService.insert(sisDeviceBindRef);
Assert.isTrue(insert, "写入设备关联表失败!");
}
return baseMapper.updateById(update) > 0;
if (CollUtil.isNotEmpty(bo.getDevicePoint())) {
// 检测设备是否存在
List<SisAcDeviceRef> refs = new ArrayList<>(bo.getDevicePoint().size());
bo.getDevicePoint().forEach(devicePoint -> {
// 暂时放弃设备校验
// SisDeviceManageVo sisDeviceManageVo = sisDeviceManageService.queryById(bo.getBindDeviceId());
// Assert.isTrue(sisDeviceManageVo != null, "设备-{}信息不存在.", bo.getBindDeviceId());
SisAcDeviceRef ref = new SisAcDeviceRef();
ref.setAcId(bo.getId());
ref.setDpId(devicePoint);
refs.add(ref);
});
// 删除原始的关联关系
Boolean b1 = sisAcDeviceRefService.deleteByAcId(bo.getId());
log.info("门禁-监控关联关系删除完成, result={}, acId={}", b1, bo.getId());
// 构建新的关联关系
Boolean b2 = sisAcDeviceRefService.batchInsert(refs);
log.info("门禁-监控设备关联关系构建完成, result={}", b2);
}
return b;
}
/**
@ -186,7 +216,9 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
// 查询所有的门禁
List<SisAccessControlVo> sisAccessControlVos = baseMapper.selectVoList();
if (sisAccessControlVos != null && !sisAccessControlVos.isEmpty()) {
List<Long> acIds = new ArrayList<>(sisAccessControlVos.size());
List<TreeNode<Long>> l1 = sisAccessControlVos.stream().map(item -> {
acIds.add(item.getId());
TreeNode<Long> node = new TreeNode<>();
node.setLevel(5);
node.setCode(item.getId());
@ -195,6 +227,18 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
return node;
}).toList();
treeNodes.addAll(l1);
// 查询所有的监控点
List<SisAcDevice> refs = sisAcDeviceRefService.queryByAcIds(acIds);
List<TreeNode<Long>> l2 = refs.stream().map(item -> {
TreeNode<Long> node = new TreeNode<>();
node.setLevel(6);
node.setCode(item.getId());
node.setParentCode(item.getAcId());
node.setLabel(item.getDeviceName());
return node;
}).toList();
treeNodes.addAll(l2);
}
return TreeUtils.build(treeNodes, 0L);
}
@ -220,7 +264,7 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
.toList();
Collection<SisAccessControl> sisACBos = new ArrayList<>();
for (AuthDoorDeviceFindRes res : filter){
for (AuthDoorDeviceFindRes res : filter) {
SisAccessControl ac = new SisAccessControl();
ac.setFactoryCode(res.getDeviceNo());
ac.setAccessCode(res.getDeviceId().toString());

View File

@ -151,7 +151,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
@Async
@Override
@Transactional(rollbackFor = Exception.class)
public void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg) {
public void createAlarmRecord(String deviceIp, Integer level, Integer type,String msg, byte[] smallImg, byte[] bigImg) {
// 校验设备信息
SisDeviceManage sisDeviceManage = deviceManageService.queryByDeviceIp(deviceIp);
if (sisDeviceManage == null) {

View File

@ -13,6 +13,7 @@ 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.sdk.huawei.domain.HWResult;
import org.dromara.sis.service.*;
import org.springframework.stereotype.Service;
@ -49,30 +50,35 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
TimeInterval interval = new TimeInterval();
// 抓拍小图
String smallImgBase64Str = Base64Encoder.encode(smallImg);
Long person = huaWeiBoxApi.findPerson(smallImgBase64Str);
log.info("人脸比对执行完成,耗时:{}ms", interval);
if (person == null) {
log.info("未命中人脸数据,暂不处理。");
HWResult<Long> result = huaWeiBoxApi.findPerson(smallImgBase64Str);
if (result.getCode() == 0) {
log.info("华为盒子比对失败,msg={}", result.getMessage());
// 产生告警数据
alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg);
return;
}
log.info("人脸比对执行完成,耗时:{}ms", interval.intervalMs());
Long person = result.getData();
// 验证当前人原是否存在授权记录
SisAuthRecordVo authRecord = authRecordService.checkAuth(person);
log.info("查询人员权限记录完成,耗时={}ms", interval.interval());
log.info("查询人员权限记录完成,耗时={}ms", interval.intervalMs());
if (authRecord == null) {
// todo 产生高危告警记录
log.info("当前人脸未授权,暂不处理。");
return;
}
Date now = new Date();
if (DateUtil.compare(now, authRecord.getEndDate()) > 0) {
// todo 生成一般告警记录
log.info("当前人脸已过期,暂不处理。");
log.info("人员[{}]没有授权记录,判定为陌生人", person);
// 不是内部人员 产生紧急的告警信息
alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "陌生人员入内", smallImg, bigImg);
return;
}
Date now = new Date();
if (DateUtil.compare(now, authRecord.getEndDate()) > 0) {
alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg);
log.info("当前人脸已过期,暂不处理。");
return;
}
// 获取当前设备的绑定设备信息
List<SisDeviceBindRefVo> bindRefList = deviceBindRefService.queryByDeviceIp(deviceIp);
log.info("查询设备绑定的梯控/门禁完成,耗时={}ms", interval.interval());
log.info("查询设备绑定的梯控/门禁完成,耗时={}ms", interval.intervalMs());
if (CollUtil.isEmpty(bindRefList)) {
log.info("当前报警设备未绑定门禁/梯控,不做处理!");
return;
@ -103,14 +109,14 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
log.info("设备绑定了未知的控制类型[{}],不处理", item.getControlType());
}
});
log.info("权限下发执行完成,耗时:{}ms", interval.interval());
log.info("权限下发执行完成,耗时:{}ms", interval.intervalMs());
}
/**
* 生成告警事件
*/
public void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg) {
alarmEventsService.createAlarmRecord(deviceIp, level, type, smallImg, bigImg);
public void createAlarmRecord(String deviceIp, Integer level, Integer type, String msg, byte[] smallImg, byte[] bigImg) {
alarmEventsService.createAlarmRecord(deviceIp, level, type, msg, smallImg, bigImg);
}
/**

View File

@ -0,0 +1,19 @@
<?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.SisAcDeviceRefMapper">
<select id="queryByAcIds" resultType="org.dromara.sis.domain.model.SisAcDevice">
SELECT
b.*,
a.ac_id
FROM
sis_ac_device_ref a
LEFT JOIN sis_device_manage b ON a.dp_id = b.id
where a.ac_id IN
<foreach collection="acIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>