feat(property): 访客登记同步 E8 平台门禁
This commit is contained in:
parent
be5d00040d
commit
8849b1d889
@ -0,0 +1,19 @@
|
||||
package org.dromara.sis.api;
|
||||
|
||||
import org.dromara.sis.api.domain.RemoteVisitor;
|
||||
|
||||
/**
|
||||
* @author lsm
|
||||
* @apiNote RemoteVisitorService
|
||||
* @since 2025/8/18
|
||||
*/
|
||||
public interface RemoteVisitorService {
|
||||
|
||||
/**
|
||||
* 访客信息写入E8平台
|
||||
*
|
||||
* @param visitor 访客信息
|
||||
* @return 访客ID
|
||||
*/
|
||||
Long syncE8PlatVisitor(RemoteVisitor visitor);
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package org.dromara.sis.api.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lsm
|
||||
* @apiNote RemoteVisitor
|
||||
* @since 2025/8/18
|
||||
*/
|
||||
@Data
|
||||
public class RemoteVisitor implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 访客名称
|
||||
*/
|
||||
private String visitorName;
|
||||
|
||||
/**
|
||||
* 手机号码
|
||||
*/
|
||||
private String mobilePhone;
|
||||
|
||||
/**
|
||||
* 被访人手机号
|
||||
*/
|
||||
private String intervieweeMobile;
|
||||
|
||||
/**
|
||||
* 授权开始时间
|
||||
*/
|
||||
private String visitorStartTime;
|
||||
|
||||
/**
|
||||
* 授权结束时间
|
||||
*/
|
||||
private String vistorEndTime;
|
||||
|
||||
/**
|
||||
* 访客人脸照
|
||||
*/
|
||||
private String visitorFaceImg;
|
||||
}
|
@ -118,5 +118,8 @@ public class TbVisitorManagement extends TenantEntity {
|
||||
*/
|
||||
private String searchValue;
|
||||
|
||||
|
||||
/**
|
||||
* e8平台id
|
||||
*/
|
||||
private Long eEightId;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package org.dromara.property.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.dromara.common.core.constant.GlobalConstants;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
@ -13,6 +15,8 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.property.domain.bo.QrCodeInfo;
|
||||
import org.dromara.sis.api.RemoteVisitorService;
|
||||
import org.dromara.sis.api.domain.RemoteVisitor;
|
||||
import org.dromara.system.api.RemoteUserService;
|
||||
import org.dromara.system.api.domain.vo.RemoteUserVo;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -30,7 +34,7 @@ import java.util.Collection;
|
||||
* 访客管理Service业务层处理
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-06-19
|
||||
* @since 2025-06-19
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@ -38,7 +42,12 @@ import java.util.Collection;
|
||||
public class TbVisitorManagementServiceImpl implements ITbVisitorManagementService {
|
||||
|
||||
private final TbVisitorManagementMapper baseMapper;
|
||||
private final RemoteUserService remoteUserService;
|
||||
|
||||
@DubboReference
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
@DubboReference
|
||||
private RemoteVisitorService remoteVisitorService;
|
||||
|
||||
/**
|
||||
* 查询访客管理
|
||||
@ -47,7 +56,7 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
* @return 访客管理
|
||||
*/
|
||||
@Override
|
||||
public TbVisitorManagementVo queryById(Long id){
|
||||
public TbVisitorManagementVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
@ -104,10 +113,11 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(TbVisitorManagementBo bo) {
|
||||
QrCodeInfo info = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY +"Qrcode" + bo.getQrCodeId());
|
||||
RedisUtils.deleteKeys(GlobalConstants.CAPTCHA_CODE_KEY +"Qrcode" + bo.getQrCodeId());
|
||||
QrCodeInfo info = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + "Qrcode" + bo.getQrCodeId());
|
||||
RedisUtils.deleteKeys(GlobalConstants.CAPTCHA_CODE_KEY + "Qrcode" + bo.getQrCodeId());
|
||||
TbVisitorManagement add = MapstructUtils.convert(bo, TbVisitorManagement.class);
|
||||
validEntityBeforeSave(add);
|
||||
assert add != null;
|
||||
add.setCreateById(info.getUserid());
|
||||
RemoteUserVo userInfoById = remoteUserService.getUserInfoById(info.getUserid());
|
||||
add.setTenantId(userInfoById.getTenantId());
|
||||
@ -116,8 +126,12 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
add.setUpdateBy(userInfoById.getUserId());
|
||||
add.setCreateDept(userInfoById.getDeptId());
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
|
||||
if (flag) {
|
||||
bo.setId(add.getId());
|
||||
Long e8Id = syncE8PlatVisitor(bo);
|
||||
add.setEEightId(e8Id);
|
||||
baseMapper.updateById(add);
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
@ -137,11 +151,33 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
// add.setCreateById(info.getUserid());
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
assert add != null;
|
||||
bo.setId(add.getId());
|
||||
Long e8Id = syncE8PlatVisitor(bo);
|
||||
add.setEEightId(e8Id);
|
||||
baseMapper.updateById(add);
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 访客登记同步E8平台门禁
|
||||
*
|
||||
* @param visitor 访客信息
|
||||
* @return E8平台访客ID
|
||||
*/
|
||||
private Long syncE8PlatVisitor(TbVisitorManagementBo visitor) {
|
||||
RemoteVisitor remoteVisitor = new RemoteVisitor();
|
||||
remoteVisitor.setVisitorName(visitor.getVisitorName());
|
||||
remoteVisitor.setMobilePhone(visitor.getVisitorPhone());
|
||||
remoteVisitor.setIntervieweeMobile(visitor.getInterviewedPhone());
|
||||
remoteVisitor.setVisitorStartTime(DateUtil.format(visitor.getVisitingBeginTime(), "yyyy-MM-dd HH:mm:ss"));
|
||||
remoteVisitor.setVistorEndTime(DateUtil.format(visitor.getVisitingEndTime(), "yyyy-MM-dd HH:mm:ss"));
|
||||
remoteVisitor.setVisitorFaceImg(visitor.getFacePictures());
|
||||
return remoteVisitorService.syncE8PlatVisitor(remoteVisitor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改访客管理
|
||||
*
|
||||
@ -158,7 +194,7 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(TbVisitorManagement entity){
|
||||
private void validEntityBeforeSave(TbVisitorManagement entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
@ -171,7 +207,7 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
|
@ -70,7 +70,6 @@ public class RemoteSisAuthServiceImpl implements RemoteSisAuthService {
|
||||
return sisAuthRecordService.deleteByPersonIds(ids, e8Ids);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询人员授权信息
|
||||
*
|
||||
|
@ -0,0 +1,60 @@
|
||||
package org.dromara.sis.dubbo;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.resource.api.RemoteFileService;
|
||||
import org.dromara.sis.api.RemoteVisitorService;
|
||||
import org.dromara.sis.api.domain.RemoteVisitor;
|
||||
import org.dromara.sis.sdk.e8.E8PlatformApi;
|
||||
import org.dromara.sis.sdk.e8.domain.visitors.req.VisitorAddReq;
|
||||
import org.dromara.sis.sdk.e8.domain.visitors.res.VisitorAddRes;
|
||||
|
||||
/**
|
||||
* @author lsm
|
||||
* @apiNote RemoteVisitorServiceImpl
|
||||
* @since 2025/8/18
|
||||
*/
|
||||
@Slf4j
|
||||
@DubboService
|
||||
@RequiredArgsConstructor
|
||||
public class RemoteVisitorServiceImpl implements RemoteVisitorService {
|
||||
|
||||
private final E8PlatformApi e8PlatformApi;
|
||||
|
||||
@DubboReference
|
||||
private RemoteFileService fileService;
|
||||
|
||||
/**
|
||||
* 访客信息写入E8平台
|
||||
*
|
||||
* @param visitor 访客信息
|
||||
* @return 访客ID
|
||||
*/
|
||||
@Override
|
||||
public Long syncE8PlatVisitor(RemoteVisitor visitor) {
|
||||
try {
|
||||
byte[] imgByte = fileService.downloadToByteArray(Long.parseLong(visitor.getVisitorFaceImg()));
|
||||
Assert.notNull(imgByte,"下载访客照片失败");
|
||||
|
||||
String imgUrl = e8PlatformApi.uploadFace(imgByte);
|
||||
Assert.notNull(imgUrl, "e8平台上传访客照片失败");
|
||||
|
||||
VisitorAddReq req = new VisitorAddReq();
|
||||
req.setVisitorName(visitor.getVisitorName());
|
||||
req.setMobilePhone(visitor.getMobilePhone());
|
||||
req.setIntervieweeMobile(visitor.getIntervieweeMobile());
|
||||
req.setVisitorStartTime(visitor.getVisitorStartTime());
|
||||
req.setVistorEndTime(visitor.getVistorEndTime());
|
||||
req.setVisitorFaceImg(imgUrl);
|
||||
VisitorAddRes res = e8PlatformApi.addVisitor(req);
|
||||
Assert.notNull(res, "e8平台新增访客登记失败");
|
||||
return res.getId();
|
||||
} catch (Exception e) {
|
||||
log.info(e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -14,10 +14,7 @@ import java.io.IOException;
|
||||
* @since 2025/8/8
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class ElevatorTcpRunner implements ApplicationRunner {
|
||||
|
||||
@Override
|
||||
public class ElevatorTcpRunner{
|
||||
public void run(ApplicationArguments args) {
|
||||
// 获取单例实例
|
||||
ElevatorControlTcpUtil elevatorHelper = ElevatorControlTcpUtil.getInstance();
|
||||
|
@ -35,6 +35,11 @@ public class VisitorAddReq {
|
||||
*/
|
||||
private String vistorEndTime;
|
||||
|
||||
/**
|
||||
* 访客人脸照
|
||||
*/
|
||||
private String visitorFaceImg;
|
||||
|
||||
/**
|
||||
* 访客登记类型 0:登记 1:邀请 2:预约
|
||||
*/
|
||||
|
@ -280,11 +280,8 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
|
||||
buffers1.get(bigImg);
|
||||
//设备ip
|
||||
String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
|
||||
SisDeviceManage device = sisDeviceManageService.queryByDeviceIp(sAlarmInfo);
|
||||
if (!device.getIsComparison()) {
|
||||
log.info("海康设备告警信息上传,设备={}, 人脸图片大小={}, 背景图片大小={}", sAlarmInfo, smallImg.length, bigImg.length);
|
||||
zeroSensationPassageService.pass(sAlarmInfo, smallImg, bigImg);
|
||||
}
|
||||
log.info("海康设备告警信息上传,设备={}, 人脸图片大小={}, 背景图片大小={}", sAlarmInfo, smallImg.length, bigImg.length);
|
||||
zeroSensationPassageService.pass(sAlarmInfo, smallImg, bigImg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -320,7 +317,6 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
|
||||
|
||||
log.info("比对结果:{},相似度:{},人员:{},id:{}", compareResults, similarity, name, pid);
|
||||
log.info("处理前置人脸比对结果,耗时:{}", interval.interval());
|
||||
zeroSensationPassageService.handleEleOut(new String(pAlarmer.sDeviceIP).trim());
|
||||
}
|
||||
|
||||
|
||||
|
@ -65,7 +65,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
if (result.getCode() != 200) {
|
||||
log.info("华为盒子比对失败,msg={}", result.getMessage());
|
||||
// 产生告警数据
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg);
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg);
|
||||
return;
|
||||
}
|
||||
log.info("人脸比对执行完成,耗时:{}ms", interval.intervalMs());
|
||||
@ -81,14 +81,14 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
} else {
|
||||
if (Objects.equals(authRecord.getRosterType(), RosterTypeEnum.BLACK_LIST.getCode())) {
|
||||
log.info("人员[{}]在黑名单中,暂不处理。", person);
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg);
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Date now = new Date();
|
||||
if (DateUtil.compare(now, authRecord.getEndDate()) > 0) {
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg);
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg);
|
||||
log.info("当前人脸已过期,暂不处理。");
|
||||
return;
|
||||
}
|
||||
@ -119,9 +119,9 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
if (Objects.equals(item.getControlType(), ControlTypeEnum.ACCESS_CONTROL.getCode())) { // 门禁
|
||||
handleAc(item.getBindId());
|
||||
} else if (item.getControlType().equals(ControlTypeEnum.ELEVATOR_OUT_CONTROL.getCode())) { // 电梯外面面板权限
|
||||
handleEle(item.getBindId(), r.getAuthGroupId(), ControlTypeEnum.ELEVATOR_OUT_CONTROL.getCode(), item.getDeviceFloorId());
|
||||
// handleEle(item.getBindId(), r.getAuthGroupId(), ControlTypeEnum.ELEVATOR_OUT_CONTROL.getCode(), item.getDeviceFloorId());
|
||||
} else if (item.getControlType().equals(ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode())) { // 电梯里面的面板
|
||||
handleEle(item.getBindId(), r.getAuthGroupId(), ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode(), 0L);
|
||||
// handleEle(item.getBindId(), r.getAuthGroupId(), ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode(), 0L);
|
||||
} else {
|
||||
log.info("设备绑定了未知的控制类型[{}],不处理", item.getControlType());
|
||||
}
|
||||
@ -166,7 +166,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
* 生成告警事件
|
||||
*/
|
||||
public void createAlarmRecord(String deviceIp, Integer level, Integer type, String msg, byte[] smallImg, byte[] bigImg) {
|
||||
alarmEventsService.createAlarmRecord(deviceIp, level, type, msg, smallImg, bigImg);
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, level, type, msg, smallImg, bigImg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user