package com.ld.igds.sec.manager; import com.ld.igds.camera.ApiCameraManager; import com.ld.igds.camera.CameraUtil; import com.ld.igds.camera.data.ApiCameraResp; import com.ld.igds.common.CoreCommonService; import com.ld.igds.common.CoreDeviceService; import com.ld.igds.common.CoreSerService; import com.ld.igds.common.dto.DepotSerData; import com.ld.igds.constant.BizType; import com.ld.igds.constant.DeviceType; import com.ld.igds.constant.RespCodeEnum; import com.ld.igds.data.PageResponse; import com.ld.igds.door.dto.DoorAccessData; import com.ld.igds.door.dto.DoorAccessParam; import com.ld.igds.door.service.CoreDoorService; import com.ld.igds.file.CoreFileService; import com.ld.igds.io.RemoteControlService; import com.ld.igds.io.RemoteManager; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.request.DeviceControlRequest; import com.ld.igds.io.request.ExeDevice; import com.ld.igds.io.response.DeviceControlResponse; import com.ld.igds.common.DepotStatusService; import com.ld.igds.models.Depot; import com.ld.igds.models.Device; import com.ld.igds.models.DeviceSer; import com.ld.igds.models.DoorSensor; import com.ld.igds.order.ExeOrderService; import com.ld.igds.order.data.ExeRequest; import com.ld.igds.sec.dto.*; import com.ld.igds.camera.data.ApiCameraData; import com.ld.igds.sec.service.CoreSecCameraService; import com.ld.igds.sec.service.CoreSecFireService; import com.ld.igds.sec.service.CoreSecPatrolService; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.DateUtil; import com.ld.igds.util.FfmpegUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 安防模块 */ @Slf4j @Component public class SecManager { @Autowired private CoreCommonService coreCommonService; @Autowired private CoreDeviceService coreDeviceService; @Autowired private ExeOrderService exeOrderService; @Autowired private CoreSerService coreSerService; @Autowired private CoreSecCameraService secCameraService; @Autowired private CoreSecFireService secFileService; @Autowired private RemoteManager remoteManager; @Autowired private CoreDoorService coreDoorService; @Autowired private DepotStatusService authCheckService; @Autowired private CoreSecPatrolService patrolService; @Autowired private CoreFileService fileService; @Autowired private ApiCameraManager apiCameraManager; private RemoteControlService remoteControlService; /** * 获取手动通风仓库的设备列表 * * @param param * @return */ public PageResponse> listDevice(SecurityParam param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } // 根据仓库缓存获取相同建筑物下的仓库集合 List depotList = coreCommonService.getCacheCommonBuildingDepot( param.getCompanyId(), param.getDepotId()); // 获取ID信息 List depotIds = depotList.stream().map(Depot::getId) .collect(Collectors.toList()); // 根据仓库多个ID获取仓库与分机的关系数据 List depotSerDataList = coreCommonService .getCacheDepotSerByDepots(param.getCompanyId(), depotIds); if (null == depotSerDataList) { log.error("没有获取到当前仓库{}的相关分机,执行失败。", param.getDepotId()); return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "没有获取到当前仓的分机信息,执行被拒绝!"); } List listAll = new ArrayList<>();// 分机的所有设备 List tempList; for (DepotSerData depotSerData : depotSerDataList) { tempList = coreDeviceService.getCacheDeviceBySerId( param.getCompanyId(), depotSerData.getSerId()); listAll.addAll(tempList); } if (listAll.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "当前仓库没有获取到设备配置信息,请联管理员!!"); } // 循环遍历出当前仓的 List listResult = listAll .stream() .filter(item -> item.getType().equals( DeviceType.TYPE_0E.getCode())) .collect(Collectors.toList()); if (null == listResult || listResult.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "当前仓库没有获取到气调设备信息,请联系管理员!!"); } return new PageResponse<>(RespCodeEnum.CODE_0000, listResult); } /** * 设备操作接口管理 * * @param param * @return */ public DeviceControlResponse controlDevice(SecurityParam param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } List deviceList = param.getDeviceList(); if (null == deviceList || deviceList.isEmpty()) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "没有获取到需要被执行的设备信息,请重新选择执行"); } // 添加逻辑验证 String msg = authCheckService.checkDepotStatus(param.getCompanyId(), param.getDepotId(), deviceList); if (null != msg) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), msg); } // 如果是单个设备 if (deviceList.size() == 1) { return controlDevice2(param); } // 如果多个设备,需要对设备按分机进行分组 Map> deviceMap = deviceList.stream().collect( Collectors.groupingBy(ExeDevice::getSerId)); String temp = ""; DeviceControlResponse tempResp; for (String key : deviceMap.keySet()) { param.setDeviceList(deviceMap.get(key)); tempResp = controlDevice2(param); if (OrderRespEnum.ORDER_ERROR.getCode().equals(tempResp.getCode())) { temp += tempResp.getMsg(); } } if ("".equals(temp)) { return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS); } return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "发送存在异常:" + temp); } /** * 单个分机设备操作接口管理 * * @param param * @return */ public DeviceControlResponse controlDevice2(SecurityParam param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } List deviceList = param.getDeviceList(); if (null == deviceList || deviceList.isEmpty()) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "没有获取到需要被执行的设备信息,请重新选择执行"); } String serId = deviceList.get(0).getSerId(); // 获取分机信息 DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), serId); DeviceControlRequest request = new DeviceControlRequest(); request.setDepotId(param.getDepotId()); request.setCompanyId(param.getCompanyId()); request.setDeviceList(deviceList); request.setBizType(BizType.SECURITY.getCode()); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(serId); request.setControlModel(deviceSer.getControlModel()); request.setRealNum(deviceList.size()); // 避免重复发送命令和添加操作记录 ExeRequest exeRequest = new ExeRequest(request); exeRequest.setRepeatTag(true); exeOrderService.checkExecute(exeRequest); // 添加开门记录 addDoorRecord(request); remoteControlService = remoteManager.getRemoteControlService(deviceSer .getProtocol()); if (null == remoteControlService) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "系统没有" + deviceSer.getProtocol() + "的协议实现,执行被拒绝!"); } DeviceControlResponse response = remoteControlService .deviceControl(request); if (OrderRespEnum.ORDER_SUCCESS.getCode().equals(response.getCode())) { exeOrderService.addCache(exeRequest); } return response; } public DeviceControlResponse queryDeviceStatus(SecurityParam param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } if (null == param.getDepotId()) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "系统没有获取到仓库参数,执行被拒绝。"); } // 根据仓库多个ID获取仓库与分机的关系数据 List depotIds = new ArrayList(); depotIds.add(param.getDepotId()); List depotSerDataList = coreCommonService .getCacheDepotSerByDepots(param.getCompanyId(), depotIds); if (null == depotSerDataList) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "当前仓库没有匹配的控制柜信息,执行被拒绝。"); } DeviceControlResponse response = new DeviceControlResponse( OrderRespEnum.ORDER_SUCCESS.getCode(), "命令发送成功!"); DeviceSer deviceSer; DeviceControlRequest request; for (DepotSerData depotSerData : depotSerDataList) { deviceSer = coreSerService.getCacheSer(param.getCompanyId(), depotSerData.getSerId()); if (null == deviceSer) { log.info("根据仓库{}获取设备状态,分机编码{}的分机不存在,取消执行。", param.getDepotId(), depotSerData.getSerId()); continue; } request = new DeviceControlRequest(); request.setDepotId(param.getDepotId()); request.setCompanyId(param.getCompanyId()); request.setBizType(BizType.SECURITY.getCode()); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(deviceSer.getId()); remoteControlService = remoteManager .getRemoteControlService(deviceSer.getProtocol()); if (null == remoteControlService) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "系统没有" + deviceSer.getProtocol() + "的协议实现,执行被拒绝!"); } response = remoteControlService.queryStatus(request); } return response; } public SecCameraDto getCameraById(String companyId, String cameraId, boolean flag) { if (StringUtils.isEmpty(cameraId)) return null; SecCameraDto dto = secCameraService.getCameraById(companyId, cameraId); if (flag) { dto.setMediaAddr(CameraUtil.updateMediaAddr2(dto, false)); } log.debug("视频信息={}", dto.toString()); return dto; } public List listCamera(String deptId, String companyId) { List list = secCameraService.getAllCacheCamera(companyId); if (null == list || list.isEmpty()) return list; if (null == deptId) return list; return list.stream().filter(item -> deptId.equals(item.getDeptId())) .collect(Collectors.toList()); } public PageResponse updatePos(List params) { if (null == params || params.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "当前没有需要执行的信息!"); } for (SecurityParam param : params) { secCameraService.updatePos(param); } secCameraService.refreshCache(ContextUtil.getCompanyId()); return new PageResponse<>(RespCodeEnum.CODE_0000, "执行成功!!"); } public List listFire(String deptId, String companyId) { List list = secFileService.getAllFire(companyId); if (null == list || list.isEmpty()) return list; if (null == deptId) return list; return list.stream().filter(item -> deptId.equals(item.getDeptId())) .collect(Collectors.toList()); } public PageResponse updateFirePos(List params) { if (null == params || params.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "当前没有需要执行的信息!"); } for (SecurityParam param : params) { secFileService.updateFirePos(param); } return new PageResponse<>(RespCodeEnum.CODE_0000, "执行成功!!"); } public SecCameraDto getPlayAddr(SecCameraDto param) { if (StringUtils.isEmpty(param.getId())) { log.error("没有获取到ID"+ param.toString()); return null; } if(StringUtils.isEmpty(param.getCompanyId())){ param.setCompanyId(ContextUtil.getCompanyId()); } // 根据id获取设备信息 SecCameraDto camera = secCameraService.getCameraById(param.getCompanyId(), param.getId()); if(camera == null){ log.error("缓存中没有获取到摄像头信息"+ param.toString()); return null; } //若为海康流媒体,使用插件播放则直接返回摄像头信息 if (CameraUtil.PLAY_TYPE_MEDIA_HIK.equals(camera.getPlayType())) { camera.setPlayAddr(CameraUtil.PLAY_TYPE_MEDIA_HIK); return camera; } //通过统一入口获取播放地址 ApiCameraData apiCameraData = new ApiCameraData(); apiCameraData.setCompanyId(camera.getCompanyId()); apiCameraData.setSn(camera.getSn()); apiCameraData.setCameraId(camera.getId()); apiCameraData.setPlayType(camera.getPlayType()); apiCameraData.setMediaAddr(CameraUtil.updateMediaAddr2(camera, false)); ApiCameraResp result = apiCameraManager.getApiCameraService(camera.getPlayType()).getPlayAddr(apiCameraData); log.debug("视频播放地址为:"+result.toString()); if (null != result && ApiCameraResp.CODE_SUCCESS.equals(result.getCode())) { camera.setPlayAddr(result.getPlayAddr()); camera.setPlayIframe(result.getPlayIframe()); return camera; } return null; } /** * 云台控制 * @param param * @return */ public ApiCameraResp ptzMedia(ApiCameraData param) { if(StringUtils.isEmpty(param.getCompanyId())){ param.setCompanyId(ContextUtil.getCompanyId()); } return apiCameraManager.getApiCameraService(param.getPlayType()).ptzMedia(param); } /** * 流媒体保活 * @param param * @return */ public ApiCameraResp keepAlive(ApiCameraData param) { return apiCameraManager.getApiCameraService(param.getPlayType()).keepAlive(param); } /** * 预置位设置 * @param param * @return */ public ApiCameraResp ptzPreset(ApiCameraData param) { return apiCameraManager.getApiCameraService(param.getPlayType()).ptzPreset(param); } /** * 验证门禁权限码 * * @param token * @param depotId * @return */ public PageResponse checkToken(String token, String depotId, String deptId, String companyId) { DoorAccessParam param = new DoorAccessParam(); param.setCompanyId(companyId); param.setDeptId(deptId); param.setToken(token); DoorAccessData doorToken = coreDoorService.getDoorAccess(param); // 判断权限码是否存在 if (doorToken == null) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "权限码不存在,请重试!"); } // 判断权限码是否失效 if (doorToken.getEnd() != null && doorToken.getEnd().before(new Date())) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "权限码已失效,请重新申请!"); } // 判断操作仓库是否有权限 if (StringUtils.isNotEmpty(depotId)) { if (!"ALL".equals(doorToken.getDepotId()) && !doorToken.getDepotId().equals(depotId)) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "您没有操作此仓库门禁的权限!!"); } } return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "验证成功!!"); } /** * 添加门禁操作记录 * * @param request */ private void addDoorRecord(DeviceControlRequest request) { // TODO return; } /** * 根据id获取巡更记录 * * @param patrolId */ public List getPatrolRecord(String patrolId) { if (StringUtils.isEmpty(patrolId)) { return null; } SecPatrolRecordParam param = new SecPatrolRecordParam(); param.setId(patrolId); List list = patrolService.getPatrolList(param); if (list == null || list.isEmpty()) { return null; } SecPatrolRecordDto data = list.get(0); param.setId(null); param.setCompanyId(data.getCompanyId()); param.setDeptId(data.getDeptId()); param.setUserName(data.getUserName()); param.setStart(DateUtil.getCurZero(data.getCreateTime())); param.setEnd(DateUtil.getNextZero(data.getCreateTime())); return patrolService.getPatrolList(param); } /** * 获取巡更记录 * * @param patrolId */ public SecPatrolRecordDto getPatrolImg(String patrolId) { if (StringUtils.isEmpty(patrolId)) { return null; } SecPatrolRecordParam param = new SecPatrolRecordParam(); param.setId(patrolId); List list = patrolService.getPatrolList(param); if (list == null || list.isEmpty()) { return null; } SecPatrolRecordDto data = list.get(0); if (StringUtils.isNotEmpty(data.getImgName())) { String bathPath = fileService.getInoutFilePath(data.getCreateTime()); String imgBase = FfmpegUtil.getImgStr(bathPath + data.getImgName()); data.setBase64Img(imgBase); } return list.get(0); } /** * 获取巡更记录 * * @param param */ @SuppressWarnings("unused") public PageResponse> queryDoorSensorData(DoorSensor param) { if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } // List list = doorSensorService.getDoorSensorList(param); List list = null; if (list == null || list.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到相关信息!"); } return new PageResponse<>(RespCodeEnum.CODE_0000, list); } public List recordImgList(Integer id) { return null; } /** * 门禁撤防 * * @param param * @return */ public PageResponse addDoorAccess(DoorAccessParam param) { if (param == null || param.getStart() == null || param.getEnd() == null || StringUtils.isEmpty(param.getDepotId())) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "撤防失败,请重试!"); } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } param.setUser(ContextUtil.getLoginUserName()); param.setToken(coreDoorService.getNewToken(null)); // 添加一条门禁权限记录 coreDoorService.addDoorAccess(param); return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "撤防成功!!"); } /** * 门禁布防 * * @param param * @return */ public PageResponse delDoorAccess(DoorAccessParam param) { if (param == null || StringUtils.isEmpty(param.getDepotId())) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "布防失败,请重试!"); } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } param.setTime(new Date()); // coreDoorService.emptyDoorAccessByDepotId(param); return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "布防成功!!"); } }