diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java index 0a95966..1d3fb3b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -21,4 +21,5 @@ private Number age; //male-男性,female-女性 private String sex; + private String staffCode; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java index 0a95966..1d3fb3b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -21,4 +21,5 @@ private Number age; //male-男性,female-女性 private String sex; + private String staffCode; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java index a054a51..3b0d492 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java @@ -22,6 +22,8 @@ String FACE_GROUP_SINGLE_ADDITION = "/api/frs/v1/face/group/single/addition"; //按条件查询人脸分组 String FACE_GROUP_QUERY = "/api/frs/v1/face/group"; + //人脸评分 + String FACE_PICTURE_CHECK = "/api/frs/v1/face/picture/check"; //单个添加人脸 String FACE_SINGLE_ADDITION = "/api/frs/v1/face/single/addition"; //批量删除人脸 @@ -64,5 +66,7 @@ String CARD_LIST = "/api/irds/v1/card/advance/cardList"; //查询访客权限组 String PRIVILEGE_GROUP = "/api/visitor/v1/privilege/group"; + //获取门禁事件的图片 + String EVENT_PICTURE = "/api/acs/v1/event/pictures"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java index 0a95966..1d3fb3b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -21,4 +21,5 @@ private Number age; //male-男性,female-女性 private String sex; + private String staffCode; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java index a054a51..3b0d492 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java @@ -22,6 +22,8 @@ String FACE_GROUP_SINGLE_ADDITION = "/api/frs/v1/face/group/single/addition"; //按条件查询人脸分组 String FACE_GROUP_QUERY = "/api/frs/v1/face/group"; + //人脸评分 + String FACE_PICTURE_CHECK = "/api/frs/v1/face/picture/check"; //单个添加人脸 String FACE_SINGLE_ADDITION = "/api/frs/v1/face/single/addition"; //批量删除人脸 @@ -64,5 +66,7 @@ String CARD_LIST = "/api/irds/v1/card/advance/cardList"; //查询访客权限组 String PRIVILEGE_GROUP = "/api/visitor/v1/privilege/group"; + //获取门禁事件的图片 + String EVENT_PICTURE = "/api/acs/v1/event/pictures"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index 58c848e..9d56d0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -31,6 +31,7 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -1330,7 +1331,17 @@ } } } - return ResponseData.success(resultMap); + Map finalMap = new HashMap<>(); + for (String key : resultMap.keySet()) { + Double value = resultMap.get(key); + if (value.compareTo(0.00) < 0) { + value = 0.0; + } + DecimalFormat df = new DecimalFormat("#.##"); + String formattedValue = df.format(value); + finalMap.put(key, Double.valueOf(formattedValue)); + } + return ResponseData.success(finalMap); } @Override @@ -1347,30 +1358,38 @@ black.setPersonType("黑名单"); }); - //查询访客列表 - List visitList = visitInfoMapper.selectForPersonList(personListRequest); - visitList.stream().forEach(visit -> { - PersonInfoRequest picRequest = new PersonInfoRequest(); - picRequest.setPicUri(visit.getPicUri()); - picRequest.setServerIndexCode(visit.getServerIndexCode()); - String reBody = JSONObject.toJSONString(picRequest); - //重定向地址获取 - visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); - visit.setPersonType("访客"); - }); + //若要接入访客机的人员轨迹,需要调用海康平台的访客机的访客数据 + + //查询访客列表,项目经理:我们的访客功能实际未使用 +// List visitList = visitInfoMapper.selectForPersonList(personListRequest); +// visitList.stream().forEach(visit -> { +// PersonInfoRequest picRequest = new PersonInfoRequest(); +// picRequest.setPicUri(visit.getPicUri()); +// picRequest.setServerIndexCode(visit.getServerIndexCode()); +// String reBody = JSONObject.toJSONString(picRequest); +// //重定向地址获取 +// visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); +// visit.setPersonType("访客"); +// }); //列表结合,顺序:员工、黑名单、访客 List resultList = new ArrayList<>(); if(!CollectionUtils.isEmpty(staffList)){ staffList.addAll(blackList); - staffList.addAll(visitList); +// staffList.addAll(visitList); resultList = staffList; }else if(!CollectionUtils.isEmpty(blackList)){ - blackList.addAll(visitList); +// blackList.addAll(visitList); resultList = blackList; }else { - resultList = visitList; +// resultList = visitList; } + if (!CollectionUtils.isEmpty(resultList)) { + //去除无图片和图片重复的数据(图片重复是因为同一员工可能在不同组织下) + List collect = resultList.stream().filter(x -> StringUtils.isNotEmpty(x.getPersonPicture())).collect(Collectors.toList()); + resultList = collect.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getPersonPicture()))), ArrayList::new)); + } + //返回的staffCode字段用于人员轨迹的闸机数据查询,personPicture字段用于人员轨迹的摄像头以图搜图数据查询 return resultList; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java index 0a95966..1d3fb3b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -21,4 +21,5 @@ private Number age; //male-男性,female-女性 private String sex; + private String staffCode; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java index a054a51..3b0d492 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java @@ -22,6 +22,8 @@ String FACE_GROUP_SINGLE_ADDITION = "/api/frs/v1/face/group/single/addition"; //按条件查询人脸分组 String FACE_GROUP_QUERY = "/api/frs/v1/face/group"; + //人脸评分 + String FACE_PICTURE_CHECK = "/api/frs/v1/face/picture/check"; //单个添加人脸 String FACE_SINGLE_ADDITION = "/api/frs/v1/face/single/addition"; //批量删除人脸 @@ -64,5 +66,7 @@ String CARD_LIST = "/api/irds/v1/card/advance/cardList"; //查询访客权限组 String PRIVILEGE_GROUP = "/api/visitor/v1/privilege/group"; + //获取门禁事件的图片 + String EVENT_PICTURE = "/api/acs/v1/event/pictures"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index 58c848e..9d56d0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -31,6 +31,7 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -1330,7 +1331,17 @@ } } } - return ResponseData.success(resultMap); + Map finalMap = new HashMap<>(); + for (String key : resultMap.keySet()) { + Double value = resultMap.get(key); + if (value.compareTo(0.00) < 0) { + value = 0.0; + } + DecimalFormat df = new DecimalFormat("#.##"); + String formattedValue = df.format(value); + finalMap.put(key, Double.valueOf(formattedValue)); + } + return ResponseData.success(finalMap); } @Override @@ -1347,30 +1358,38 @@ black.setPersonType("黑名单"); }); - //查询访客列表 - List visitList = visitInfoMapper.selectForPersonList(personListRequest); - visitList.stream().forEach(visit -> { - PersonInfoRequest picRequest = new PersonInfoRequest(); - picRequest.setPicUri(visit.getPicUri()); - picRequest.setServerIndexCode(visit.getServerIndexCode()); - String reBody = JSONObject.toJSONString(picRequest); - //重定向地址获取 - visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); - visit.setPersonType("访客"); - }); + //若要接入访客机的人员轨迹,需要调用海康平台的访客机的访客数据 + + //查询访客列表,项目经理:我们的访客功能实际未使用 +// List visitList = visitInfoMapper.selectForPersonList(personListRequest); +// visitList.stream().forEach(visit -> { +// PersonInfoRequest picRequest = new PersonInfoRequest(); +// picRequest.setPicUri(visit.getPicUri()); +// picRequest.setServerIndexCode(visit.getServerIndexCode()); +// String reBody = JSONObject.toJSONString(picRequest); +// //重定向地址获取 +// visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); +// visit.setPersonType("访客"); +// }); //列表结合,顺序:员工、黑名单、访客 List resultList = new ArrayList<>(); if(!CollectionUtils.isEmpty(staffList)){ staffList.addAll(blackList); - staffList.addAll(visitList); +// staffList.addAll(visitList); resultList = staffList; }else if(!CollectionUtils.isEmpty(blackList)){ - blackList.addAll(visitList); +// blackList.addAll(visitList); resultList = blackList; }else { - resultList = visitList; +// resultList = visitList; } + if (!CollectionUtils.isEmpty(resultList)) { + //去除无图片和图片重复的数据(图片重复是因为同一员工可能在不同组织下) + List collect = resultList.stream().filter(x -> StringUtils.isNotEmpty(x.getPersonPicture())).collect(Collectors.toList()); + resultList = collect.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getPersonPicture()))), ArrayList::new)); + } + //返回的staffCode字段用于人员轨迹的闸机数据查询,personPicture字段用于人员轨迹的摄像头以图搜图数据查询 return resultList; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 2e3c478..5690704 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -106,7 +106,7 @@ appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorPermissionSet visitorPermissionSet = new VisitorPermissionSet(); - visitorPermissionSet.setPrivilegeGroupIds(positionPrivilegeInitCache.getPositionPrivilegeMap(visitorApply.getVisitReason())); + visitorPermissionSet.setPrivilegeGroupIds(positionPrivilegeInitCache.getPositionPrivilegeMap(visitorApply.getVisitPosition())); appointmentFreeRegisterRequest.setVisitorPermissionSet(visitorPermissionSet); VisitorInfo visitorInfo = new VisitorInfo(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java index 128b206..e1b8290 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/hik/HikController.java @@ -156,7 +156,7 @@ Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - if(!Objects.isNull(caseInfo)){ + if (!Objects.isNull(caseInfo)) { BeanUtils.copyProperties(caseInfo, caseInfo1); } JSONObject event = (JSONObject) iterator.next(); @@ -174,7 +174,7 @@ //获取重点人员抓拍照片 JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); String faceUrl = ""; - if(!Objects.isNull(snap)){ + if (!Objects.isNull(snap)) { faceUrl = snap.getString("faceUrl"); } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); @@ -218,12 +218,12 @@ } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandle(event); - } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)) { //高空抛物事件处理 caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } else if (SecurityEventType.CARD_COMPARE_PASS.equals(eventType) || SecurityEventType.FACE_COMPARE_PASS.equals(eventType) - || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)){ + || SecurityEventType.FACE_CARD_COMPARE_PASS.equals(eventType)) { //门禁事件,添加到人员进出记录表 hikService.doorPassHandle(event); } @@ -253,10 +253,11 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + //1、摄像头识别人脸的数据 + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("male"); } - if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + if (!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())) { searchPicturesRequest.setSex("female"); } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); @@ -272,16 +273,48 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - //结构处理 List responseList = new ArrayList(); + //以图搜图结果处理 + handleCameraResponse(resultJson, responseList); + + //闸机识别人脸的数据 + if (StringUtils.isNotBlank(searchPicturesRequest.getStaffCode())) { + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(50); + List eventTypes = new ArrayList<>(); +// eventTypes.add(SecurityEventType.CARD_COMPARE_PASS);//刷卡的数据 + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + doorEventsRequest.setEventTypes(eventTypes); + doorEventsRequest.setPersonIds(Collections.singletonList(searchPicturesRequest.getStaffCode())); + doorEventsRequest.setStartTime(startTime); + doorEventsRequest.setEndTime(endTime); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr1); + return ResponseData.error("查询海康门禁点事件v2失败"); + } + //门禁点事件结果处理 + handleDoorResponse(responseList, resultJson1); + } + + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); + } + + private void handleCameraResponse(JSONObject resultJson, List responseList) { JSONObject data = resultJson.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); list.stream().forEach(json -> { JSONObject json1 = (JSONObject) json; String cameraIndexCode = json1.getString("cameraIndexCode"); - if(StringUtils.isNotEmpty(cameraIndexCode)){ + if (StringUtils.isNotEmpty(cameraIndexCode)) { DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); - if(!Objects.isNull(deviceInfo)){ + if (!Objects.isNull(deviceInfo)) { SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); searchPicturesResponse.setDevName(deviceInfo.getDevName()); searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); @@ -307,10 +340,46 @@ } } }); - //按时间正序排序 - List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + } - return ResponseData.success(resultList); + private void handleDoorResponse(List responseList, JSONObject resultJson1) { + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.nonNull(dataJson1)) { + JSONArray list = (JSONArray) dataJson1.get("list"); + if (Objects.nonNull(list)) { + list.parallelStream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String indexCode = json1.getString("doorIndexCode"); + if (StringUtils.isNotEmpty(indexCode)) { + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(indexCode); + if (!Objects.isNull(deviceInfo)) { + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + EventInfoRequest picRequest = new EventInfoRequest(); + picRequest.setPicUri(json1.getString("picUri")); + picRequest.setSvrIndexCode(json1.getString("svrIndexCode")); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.EVENT_PICTURE, reBody); + searchPicturesResponse.setFacePicUrl(url); + searchPicturesResponse.setBkgPicUrl(url); + searchPicturesResponse.setSimilarity(null); + DateTime parse = DateUtil.parse(json1.getString("eventTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(null); + searchPicturesResponse.setRect(null); + responseList.add(searchPicturesResponse); + } + } + }); + } + } } @@ -449,6 +518,18 @@ } /** + * 人脸评分,图片格式仅支持JPG,图片大小为128B到4M,人脸图片的二进制数据经过Base64 编码后的字符串 + */ + @PostMapping("/hik/face/picture/check") + @ResponseBody + public Object pictureCheck(@RequestBody Map map) { + //参数名facePicBinaryData + String body = JSONObject.toJSONString(map); + String resultStr = HikUtil.hikApi(HikUri.FACE_PICTURE_CHECK, body); + return resultStr; + } + + /** * 门禁今日进出人数统计 */ @PostMapping("/hik/search/doorInout") @@ -456,7 +537,7 @@ public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { //通过分组id获取闸机编号(门禁点唯一标识)列表 List indexCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); - if(CollectionUtils.isEmpty(indexCodes)){ + if (CollectionUtils.isEmpty(indexCodes)) { log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); return ResponseData.error("不存在分组下的闸机编号"); } @@ -474,12 +555,12 @@ doorEventsRequest.setEndTime(endTime); //结束时间,当前 JSONArray dataArray = new JSONArray(); - for (int i = 0; i < indexCodes.size(); i+=10) { + for (int i = 0; i < indexCodes.size(); i += 10) { Integer toIndex = 10; - if(i + 10 > indexCodes.size()){ + if (i + 10 > indexCodes.size()) { toIndex = indexCodes.size() - i; } - List newList =indexCodes.subList(i, i + toIndex); + List newList = indexCodes.subList(i, i + toIndex); JSONArray jsonArray = queryDoorEvents(doorEventsRequest, newList); dataArray.addAll(jsonArray); } @@ -507,7 +588,7 @@ return response; } - private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes){ + private JSONArray queryDoorEvents(DoorEventsRequest doorEventsRequest, List doorIndexCodes) { doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 String body = JSONObject.toJSONString(doorEventsRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java index 445467d..39eb697 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -21,7 +21,7 @@ //性别 private String gender; - @JsonIgnore +// @JsonIgnore private String staffCode; @JsonIgnore private String picUri; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java index 4e6ea6c..e9ca45a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/DoorEventsRequest.java @@ -15,6 +15,8 @@ private Integer pageSize; private String startTime; private String endTime; + private String order = "asc"; + private List personIds; private List doorIndexCodes; private List eventTypes; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java new file mode 100644 index 0000000..bfeb41d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/EventInfoRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: 获取门禁事件的图片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class EventInfoRequest { + //获取照片使用 + private String picUri; + private String svrIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java index 0a95966..1d3fb3b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -21,4 +21,5 @@ private Number age; //male-男性,female-女性 private String sex; + private String staffCode; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java index a054a51..3b0d492 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/HikUri.java @@ -22,6 +22,8 @@ String FACE_GROUP_SINGLE_ADDITION = "/api/frs/v1/face/group/single/addition"; //按条件查询人脸分组 String FACE_GROUP_QUERY = "/api/frs/v1/face/group"; + //人脸评分 + String FACE_PICTURE_CHECK = "/api/frs/v1/face/picture/check"; //单个添加人脸 String FACE_SINGLE_ADDITION = "/api/frs/v1/face/single/addition"; //批量删除人脸 @@ -64,5 +66,7 @@ String CARD_LIST = "/api/irds/v1/card/advance/cardList"; //查询访客权限组 String PRIVILEGE_GROUP = "/api/visitor/v1/privilege/group"; + //获取门禁事件的图片 + String EVENT_PICTURE = "/api/acs/v1/event/pictures"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index 58c848e..9d56d0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -31,6 +31,7 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -1330,7 +1331,17 @@ } } } - return ResponseData.success(resultMap); + Map finalMap = new HashMap<>(); + for (String key : resultMap.keySet()) { + Double value = resultMap.get(key); + if (value.compareTo(0.00) < 0) { + value = 0.0; + } + DecimalFormat df = new DecimalFormat("#.##"); + String formattedValue = df.format(value); + finalMap.put(key, Double.valueOf(formattedValue)); + } + return ResponseData.success(finalMap); } @Override @@ -1347,30 +1358,38 @@ black.setPersonType("黑名单"); }); - //查询访客列表 - List visitList = visitInfoMapper.selectForPersonList(personListRequest); - visitList.stream().forEach(visit -> { - PersonInfoRequest picRequest = new PersonInfoRequest(); - picRequest.setPicUri(visit.getPicUri()); - picRequest.setServerIndexCode(visit.getServerIndexCode()); - String reBody = JSONObject.toJSONString(picRequest); - //重定向地址获取 - visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); - visit.setPersonType("访客"); - }); + //若要接入访客机的人员轨迹,需要调用海康平台的访客机的访客数据 + + //查询访客列表,项目经理:我们的访客功能实际未使用 +// List visitList = visitInfoMapper.selectForPersonList(personListRequest); +// visitList.stream().forEach(visit -> { +// PersonInfoRequest picRequest = new PersonInfoRequest(); +// picRequest.setPicUri(visit.getPicUri()); +// picRequest.setServerIndexCode(visit.getServerIndexCode()); +// String reBody = JSONObject.toJSONString(picRequest); +// //重定向地址获取 +// visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); +// visit.setPersonType("访客"); +// }); //列表结合,顺序:员工、黑名单、访客 List resultList = new ArrayList<>(); if(!CollectionUtils.isEmpty(staffList)){ staffList.addAll(blackList); - staffList.addAll(visitList); +// staffList.addAll(visitList); resultList = staffList; }else if(!CollectionUtils.isEmpty(blackList)){ - blackList.addAll(visitList); +// blackList.addAll(visitList); resultList = blackList; }else { - resultList = visitList; +// resultList = visitList; } + if (!CollectionUtils.isEmpty(resultList)) { + //去除无图片和图片重复的数据(图片重复是因为同一员工可能在不同组织下) + List collect = resultList.stream().filter(x -> StringUtils.isNotEmpty(x.getPersonPicture())).collect(Collectors.toList()); + resultList = collect.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getPersonPicture()))), ArrayList::new)); + } + //返回的staffCode字段用于人员轨迹的闸机数据查询,personPicture字段用于人员轨迹的摄像头以图搜图数据查询 return resultList; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 2e3c478..5690704 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -106,7 +106,7 @@ appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorPermissionSet visitorPermissionSet = new VisitorPermissionSet(); - visitorPermissionSet.setPrivilegeGroupIds(positionPrivilegeInitCache.getPositionPrivilegeMap(visitorApply.getVisitReason())); + visitorPermissionSet.setPrivilegeGroupIds(positionPrivilegeInitCache.getPositionPrivilegeMap(visitorApply.getVisitPosition())); appointmentFreeRegisterRequest.setVisitorPermissionSet(visitorPermissionSet); VisitorInfo visitorInfo = new VisitorInfo(); diff --git a/casic-web/src/main/resources/logback-spring.xml b/casic-web/src/main/resources/logback-spring.xml index c0c7ac9..60615cb 100644 --- a/casic-web/src/main/resources/logback-spring.xml +++ b/casic-web/src/main/resources/logback-spring.xml @@ -49,7 +49,12 @@ ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log - + + 7 + + 20GB + + true @@ -85,7 +90,9 @@ ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log - + 7 + 20GB + true