Compare commits

...

2 Commits

Author SHA1 Message Date
187763e0e5 Merge remote-tracking branch 'origin/master'
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m22s
2025-08-18 16:54:27 +08:00
8849b1d889 feat(property): 访客登记同步 E8 平台门禁 2025-08-18 16:54:10 +08:00
10 changed files with 188 additions and 25 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -118,5 +118,8 @@ public class TbVisitorManagement extends TenantEntity {
*/
private String searchValue;
/**
* e8平台id
*/
private Long eEightId;
}

View File

@ -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;

View File

@ -70,7 +70,6 @@ public class RemoteSisAuthServiceImpl implements RemoteSisAuthService {
return sisAuthRecordService.deleteByPersonIds(ids, e8Ids);
}
/**
* 查询人员授权信息
*

View File

@ -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;
}
}
}

View File

@ -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();

View File

@ -35,6 +35,11 @@ public class VisitorAddReq {
*/
private String vistorEndTime;
/**
* 访客人脸照
*/
private String visitorFaceImg;
/**
* 访客登记类型 0:登记 1:邀请 2:预约
*/

View File

@ -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());
}

View File

@ -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);
}
/**