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 a44cd638..6feddeb9 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 @@ -8,18 +8,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.property.api.RemoteFloorService; -import org.dromara.sis.domain.vo.SisAccessControlVo; -import org.dromara.sis.domain.vo.SisAuthGroupRefVo; -import org.dromara.sis.domain.vo.SisAuthRecordVo; -import org.dromara.sis.domain.vo.SisDeviceBindRefVo; +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.ISisAccessControlService; -import org.dromara.sis.service.ISisAuthGroupRefService; -import org.dromara.sis.service.ISisAuthRecordService; -import org.dromara.sis.service.ISisDeviceBindRefService; +import org.dromara.sis.service.*; import org.springframework.stereotype.Component; import java.io.FileNotFoundException; @@ -30,6 +26,9 @@ 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.*; @@ -40,9 +39,11 @@ 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 @@ -362,71 +363,61 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { }); } - // 授权记录 -// List authVoList = authRecordService.checkAuth(person); - // 获取门禁id -// Collection acIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 1).map(SisAuthRecordVo::getDeviceId).toList(); -// if (CollUtil.isNotEmpty(acIds)) { -// acIds.forEach(id -> { -// Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null); -// SisAccessControlVo ac = accessControlService.queryById(deviceId); -// if (ac != null) { -// 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 eleIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 2).map(SisAuthRecordVo::getDeviceId).toList(); -// if (CollUtil.isNotEmpty(eleIds)) { -// eleIds.forEach(id -> { -// Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null); -// SisElevatorInfoVo ele = elevatorInfoService.queryById(deviceId); -// if (ele != null) { -// log.info("下发电梯权限"); -// // 根据单元ID获取楼层信息 -// List floorInfo = remoteFloorService.queryByUnitId(ele.getUnitId()); -// // 获取电梯⇄楼层关联信息 -// List floorRefList = elevatorFloorRefService.queryByAuthGroupId(deviceId); -// // 获取楼层数组 -// List 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); -// } -// }); -// } -// }); -// } + Collection 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 floorInfo = remoteFloorService.queryByUnitId(deviceId); + // 获取电梯⇄楼层关联信息 + List floorRefList = elevatorFloorRefService.queryByAuthGroupId(authRecord.getGroupId()); + // 获取楼层数组 + List 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); - // todo 做延时队列,关闭梯控授权 - - -// try { -// Thread.sleep(10000L); -// List ass = Arrays.asList(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3); -// for (int i = 0; i < ass.size(); i++) { -// HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), ass.get(i)); -// } -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } return false; } }