From 8849b1d889aef6a6832fa9160a710bbde614d9e0 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Mon, 18 Aug 2025 16:54:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(property):=20=E8=AE=BF=E5=AE=A2=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E5=90=8C=E6=AD=A5=20E8=20=E5=B9=B3=E5=8F=B0=E9=97=A8?= =?UTF-8?q?=E7=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sis/api/RemoteVisitorService.java | 19 ++++++ .../dromara/sis/api/domain/RemoteVisitor.java | 48 +++++++++++++++ .../property/domain/TbVisitorManagement.java | 5 +- .../impl/TbVisitorManagementServiceImpl.java | 50 +++++++++++++--- .../sis/dubbo/RemoteSisAuthServiceImpl.java | 1 - .../sis/dubbo/RemoteVisitorServiceImpl.java | 60 +++++++++++++++++++ .../dromara/sis/runner/ElevatorTcpRunner.java | 5 +- .../e8/domain/visitors/req/VisitorAddReq.java | 5 ++ .../sis/sdk/hik/calback/HikAlarmCallBack.java | 8 +-- .../impl/ZeroSensationPassageServiceImpl.java | 12 ++-- 10 files changed, 188 insertions(+), 25 deletions(-) create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteVisitorService.java create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteVisitor.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteVisitorService.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteVisitorService.java new file mode 100644 index 00000000..9e105a96 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteVisitorService.java @@ -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); +} diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteVisitor.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteVisitor.java new file mode 100644 index 00000000..7acf9346 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteVisitor.java @@ -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; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbVisitorManagement.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbVisitorManagement.java index 391a472b..296098a1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbVisitorManagement.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbVisitorManagement.java @@ -118,5 +118,8 @@ public class TbVisitorManagement extends TenantEntity { */ private String searchValue; - + /** + * e8平台id + */ + private Long eEightId; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java index 63dd52d0..060cb46c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java @@ -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 ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSisAuthServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSisAuthServiceImpl.java index e524d900..46a2adfb 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSisAuthServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSisAuthServiceImpl.java @@ -70,7 +70,6 @@ public class RemoteSisAuthServiceImpl implements RemoteSisAuthService { return sisAuthRecordService.deleteByPersonIds(ids, e8Ids); } - /** * 查询人员授权信息 * diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java new file mode 100644 index 00000000..400f3cb3 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java @@ -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; + } + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/ElevatorTcpRunner.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/ElevatorTcpRunner.java index 832cba7a..b6379264 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/ElevatorTcpRunner.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/ElevatorTcpRunner.java @@ -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(); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/visitors/req/VisitorAddReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/visitors/req/VisitorAddReq.java index b31020f2..01c22337 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/visitors/req/VisitorAddReq.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/visitors/req/VisitorAddReq.java @@ -35,6 +35,11 @@ public class VisitorAddReq { */ private String vistorEndTime; + /** + * 访客人脸照 + */ + private String visitorFaceImg; + /** * 访客登记类型 0:登记 1:邀请 2:预约 */ diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index f5996122..27aac3d9 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -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()); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java index df8540a6..c705d7d7 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java @@ -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); } /**