diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2f2b9e3..2608ba8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.dao.GateGroupMapper; import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -90,6 +91,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object addDeviceInfo(DeviceInfo deviceInfo) { DeviceInfo device = deviceInfoMapper.getDeviceInfo(deviceInfo.getDevCode()); if(!Objects.isNull(device)){ @@ -102,6 +104,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object updateDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.updateById(deviceInfo) > 0){ return ResponseData.success(); @@ -110,6 +113,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.deleteById(deviceInfo.getId()) > 0){ return ResponseData.success(); @@ -118,6 +122,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteBatchDeviceInfo(List ids) { if(deviceInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); @@ -126,6 +131,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); @@ -204,11 +210,13 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int addDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.insert(deviceRepairLog); } @Override + @Transactional(rollbackFor = Exception.class) public int deleteDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.deleteById(deviceRepairLog.getId()); } @@ -233,7 +241,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object addGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroupDb = gateGroupMapper.getGateGroupByName(gateGroupDTO.getGroupName()); if(!Objects.isNull(gateGroupDb)){ @@ -261,7 +269,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object updateGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroup = new GateGroup(); BeanUtils.copyProperties(gateGroupDTO, gateGroup); @@ -289,6 +297,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteGateGroupDTO(GateGroupDTO gateGroupDTO) { int i = gateGroupMapper.deleteById(gateGroupDTO.getId()); Map columnMap = new HashMap<>(); @@ -326,9 +335,16 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int updateBatchGateGroupStatus(List deviceCodes, String status) { return deviceInfoMapper.updateStatusBatchByCodes(deviceCodes, status); } + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceInfoBatch(List acsDeviceList) { + return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2f2b9e3..2608ba8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.dao.GateGroupMapper; import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -90,6 +91,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object addDeviceInfo(DeviceInfo deviceInfo) { DeviceInfo device = deviceInfoMapper.getDeviceInfo(deviceInfo.getDevCode()); if(!Objects.isNull(device)){ @@ -102,6 +104,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object updateDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.updateById(deviceInfo) > 0){ return ResponseData.success(); @@ -110,6 +113,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.deleteById(deviceInfo.getId()) > 0){ return ResponseData.success(); @@ -118,6 +122,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteBatchDeviceInfo(List ids) { if(deviceInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); @@ -126,6 +131,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); @@ -204,11 +210,13 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int addDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.insert(deviceRepairLog); } @Override + @Transactional(rollbackFor = Exception.class) public int deleteDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.deleteById(deviceRepairLog.getId()); } @@ -233,7 +241,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object addGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroupDb = gateGroupMapper.getGateGroupByName(gateGroupDTO.getGroupName()); if(!Objects.isNull(gateGroupDb)){ @@ -261,7 +269,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object updateGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroup = new GateGroup(); BeanUtils.copyProperties(gateGroupDTO, gateGroup); @@ -289,6 +297,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteGateGroupDTO(GateGroupDTO gateGroupDTO) { int i = gateGroupMapper.deleteById(gateGroupDTO.getId()); Map columnMap = new HashMap<>(); @@ -326,9 +335,16 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int updateBatchGateGroupStatus(List deviceCodes, String status) { return deviceInfoMapper.updateStatusBatchByCodes(deviceCodes, status); } + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceInfoBatch(List acsDeviceList) { + return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java index dbad48f..ff60402 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java @@ -62,6 +62,7 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -86,6 +87,7 @@ log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -110,6 +112,7 @@ log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -135,6 +138,7 @@ log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -146,7 +150,7 @@ List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ - log.error("海康回调,更新监控点离线线状态失败!"); + log.error("海康回调,更新监控点离线状态失败!"); return null; } return caseInfo; @@ -156,6 +160,10 @@ public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + return; + } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); @@ -180,6 +188,7 @@ log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -211,6 +220,32 @@ } @Override + public CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo) { + //加入到安防事件 + String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 + String happenTimeISO = String.valueOf(event.get("happenTime")); + DateTime parse = DateUtil.parse(happenTimeISO); + String happenTime = DateUtil.formatDateTime(parse); + caseInfo.setHappenTime(happenTime); //发生时间 + // TODO: 2022/7/28 字典值选择 + List dict = dictService.findInDictByCode(SecurityEventDict.CASE_STATUS); + caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } + caseInfo.setIndexCode(srcIndex); + caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code + caseInfo.setDevName(deviceInfo.getDevName()); //设备名 + caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 + caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + return caseInfo; + } + + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -301,7 +336,7 @@ } @Override - public void visitorRegisterHandler(JSONObject event) { + public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("startTime")); @@ -332,7 +367,7 @@ } @Override - public void visitorCheckOutHandler(JSONObject event) { + public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); String endTime = DateUtil.formatDateTime(parse); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2f2b9e3..2608ba8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.dao.GateGroupMapper; import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -90,6 +91,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object addDeviceInfo(DeviceInfo deviceInfo) { DeviceInfo device = deviceInfoMapper.getDeviceInfo(deviceInfo.getDevCode()); if(!Objects.isNull(device)){ @@ -102,6 +104,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object updateDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.updateById(deviceInfo) > 0){ return ResponseData.success(); @@ -110,6 +113,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.deleteById(deviceInfo.getId()) > 0){ return ResponseData.success(); @@ -118,6 +122,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteBatchDeviceInfo(List ids) { if(deviceInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); @@ -126,6 +131,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); @@ -204,11 +210,13 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int addDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.insert(deviceRepairLog); } @Override + @Transactional(rollbackFor = Exception.class) public int deleteDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.deleteById(deviceRepairLog.getId()); } @@ -233,7 +241,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object addGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroupDb = gateGroupMapper.getGateGroupByName(gateGroupDTO.getGroupName()); if(!Objects.isNull(gateGroupDb)){ @@ -261,7 +269,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object updateGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroup = new GateGroup(); BeanUtils.copyProperties(gateGroupDTO, gateGroup); @@ -289,6 +297,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteGateGroupDTO(GateGroupDTO gateGroupDTO) { int i = gateGroupMapper.deleteById(gateGroupDTO.getId()); Map columnMap = new HashMap<>(); @@ -326,9 +335,16 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int updateBatchGateGroupStatus(List deviceCodes, String status) { return deviceInfoMapper.updateStatusBatchByCodes(deviceCodes, status); } + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceInfoBatch(List acsDeviceList) { + return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java index dbad48f..ff60402 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java @@ -62,6 +62,7 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -86,6 +87,7 @@ log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -110,6 +112,7 @@ log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -135,6 +138,7 @@ log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -146,7 +150,7 @@ List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ - log.error("海康回调,更新监控点离线线状态失败!"); + log.error("海康回调,更新监控点离线状态失败!"); return null; } return caseInfo; @@ -156,6 +160,10 @@ public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + return; + } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); @@ -180,6 +188,7 @@ log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -211,6 +220,32 @@ } @Override + public CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo) { + //加入到安防事件 + String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 + String happenTimeISO = String.valueOf(event.get("happenTime")); + DateTime parse = DateUtil.parse(happenTimeISO); + String happenTime = DateUtil.formatDateTime(parse); + caseInfo.setHappenTime(happenTime); //发生时间 + // TODO: 2022/7/28 字典值选择 + List dict = dictService.findInDictByCode(SecurityEventDict.CASE_STATUS); + caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } + caseInfo.setIndexCode(srcIndex); + caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code + caseInfo.setDevName(deviceInfo.getDevName()); //设备名 + caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 + caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + return caseInfo; + } + + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -301,7 +336,7 @@ } @Override - public void visitorRegisterHandler(JSONObject event) { + public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("startTime")); @@ -332,7 +367,7 @@ } @Override - public void visitorCheckOutHandler(JSONObject event) { + public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); String endTime = DateUtil.formatDateTime(parse); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java index d19dceb..c2714f5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java @@ -9,6 +9,7 @@ import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; @@ -103,6 +104,7 @@ JSONObject data = (JSONObject)resultJson.get("data"); String faceId = data.getString("faceId"); staffInfo.setStaffFaceId(faceId); + staffInfo.setPicture(""); if(staffInfoMapper.insert(staffInfo) > 0){ return ResponseData.success(); } @@ -284,4 +286,10 @@ } return 1; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateStaffInfoBatch(List personList) { + return staffInfoMapper.updateStaffInfoBatch(personList); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2f2b9e3..2608ba8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.dao.GateGroupMapper; import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -90,6 +91,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object addDeviceInfo(DeviceInfo deviceInfo) { DeviceInfo device = deviceInfoMapper.getDeviceInfo(deviceInfo.getDevCode()); if(!Objects.isNull(device)){ @@ -102,6 +104,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object updateDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.updateById(deviceInfo) > 0){ return ResponseData.success(); @@ -110,6 +113,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.deleteById(deviceInfo.getId()) > 0){ return ResponseData.success(); @@ -118,6 +122,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteBatchDeviceInfo(List ids) { if(deviceInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); @@ -126,6 +131,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); @@ -204,11 +210,13 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int addDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.insert(deviceRepairLog); } @Override + @Transactional(rollbackFor = Exception.class) public int deleteDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.deleteById(deviceRepairLog.getId()); } @@ -233,7 +241,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object addGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroupDb = gateGroupMapper.getGateGroupByName(gateGroupDTO.getGroupName()); if(!Objects.isNull(gateGroupDb)){ @@ -261,7 +269,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object updateGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroup = new GateGroup(); BeanUtils.copyProperties(gateGroupDTO, gateGroup); @@ -289,6 +297,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteGateGroupDTO(GateGroupDTO gateGroupDTO) { int i = gateGroupMapper.deleteById(gateGroupDTO.getId()); Map columnMap = new HashMap<>(); @@ -326,9 +335,16 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int updateBatchGateGroupStatus(List deviceCodes, String status) { return deviceInfoMapper.updateStatusBatchByCodes(deviceCodes, status); } + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceInfoBatch(List acsDeviceList) { + return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java index dbad48f..ff60402 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java @@ -62,6 +62,7 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -86,6 +87,7 @@ log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -110,6 +112,7 @@ log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -135,6 +138,7 @@ log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -146,7 +150,7 @@ List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ - log.error("海康回调,更新监控点离线线状态失败!"); + log.error("海康回调,更新监控点离线状态失败!"); return null; } return caseInfo; @@ -156,6 +160,10 @@ public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + return; + } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); @@ -180,6 +188,7 @@ log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -211,6 +220,32 @@ } @Override + public CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo) { + //加入到安防事件 + String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 + String happenTimeISO = String.valueOf(event.get("happenTime")); + DateTime parse = DateUtil.parse(happenTimeISO); + String happenTime = DateUtil.formatDateTime(parse); + caseInfo.setHappenTime(happenTime); //发生时间 + // TODO: 2022/7/28 字典值选择 + List dict = dictService.findInDictByCode(SecurityEventDict.CASE_STATUS); + caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } + caseInfo.setIndexCode(srcIndex); + caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code + caseInfo.setDevName(deviceInfo.getDevName()); //设备名 + caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 + caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + return caseInfo; + } + + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -301,7 +336,7 @@ } @Override - public void visitorRegisterHandler(JSONObject event) { + public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("startTime")); @@ -332,7 +367,7 @@ } @Override - public void visitorCheckOutHandler(JSONObject event) { + public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); String endTime = DateUtil.formatDateTime(parse); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java index d19dceb..c2714f5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java @@ -9,6 +9,7 @@ import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; @@ -103,6 +104,7 @@ JSONObject data = (JSONObject)resultJson.get("data"); String faceId = data.getString("faceId"); staffInfo.setStaffFaceId(faceId); + staffInfo.setPicture(""); if(staffInfoMapper.insert(staffInfo) > 0){ return ResponseData.success(); } @@ -284,4 +286,10 @@ } return 1; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateStaffInfoBatch(List personList) { + return staffInfoMapper.updateStaffInfoBatch(personList); + } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 12786de..26e049d 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -60,6 +60,12 @@ org.springframework.boot spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-devtools + runtime + com.casic @@ -164,6 +170,15 @@ maven-war-plugin ${maven.war.plugin.version} + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java new file mode 100644 index 0000000..bd265c9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/UtilController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.hik.PersonListRequest; +import com.casic.missiles.modular.enums.HikUri; +import com.casic.missiles.modular.service.DeviceInfoService; +import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 11:12 + */ +@Slf4j +@RestController +@RequestMapping("/util") +public class UtilController { + @Autowired + private StaffInfoService staffInfoService; + + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 批量添加人员到海康没有人脸id,补全人脸id数据功能 + * 请求时控制分页参数 + */ + @PostMapping("/supply/faceData") + @ResponseBody + public Object supplyFaceData(@RequestBody PersonListRequest request) { + //查询海康人员信息 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,获取人员列表v2失败,海康response:{}", resultStr); + return ResponseData.error("获取人员列表失败"); + } + List personList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String personId = next.getString("personId"); + JSONArray personPhotos = (JSONArray) next.get("personPhoto"); + if(!Objects.isNull(personPhotos)){ + JSONObject personPhoto = (JSONObject) personPhotos.get(0); + String faceId = personPhoto.getString("personPhotoIndexCode"); + PersonListDTO personListDTO = new PersonListDTO(); + personListDTO.setPersonId(personId); + personListDTO.setFaceId(faceId); + personList.add(personListDTO); + } + } + //批量更新人员人脸id + int i = staffInfoService.updateStaffInfoBatch(personList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全人脸id数据失败"); + } + + /** + * 门禁点编号数据补全功能开发(海康的门禁点导不出编号); + */ + @PostMapping("/supply/acsDeviceData") + @ResponseBody + public Object supplyAcsDeviceData(@RequestBody PersonListRequest request) { + //根据ip更新门禁点编号 + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.ACS_DEVICE_LIST, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询门禁设备列表v2失败,海康response:{}", resultStr); + return ResponseData.error("查询门禁设备列表失败"); + } + List acsDeviceList = new ArrayList<>(); + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + Iterator iterator = dataArray.stream().iterator(); + while(iterator.hasNext()){ + JSONObject next = (JSONObject) iterator.next(); + String indexCode = next.getString("indexCode"); + String ip = next.getString("ip"); + if(StringUtils.isNotEmpty(ip)){ + AcsDeviceListDTO acsDeviceListDTO = new AcsDeviceListDTO(); + acsDeviceListDTO.setIndexCode(indexCode); + acsDeviceListDTO.setIp(ip); + acsDeviceList.add(acsDeviceListDTO); + } + } + //批量更新门禁点编号 + int i = deviceInfoService.updateDeviceInfoBatch(acsDeviceList); + if(i >= 0){ + return ResponseData.success(); + } + return ResponseData.error("补全门禁点编号数据失败"); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java index 7b1dcf6..b3fb825 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/CockpitController.java @@ -324,7 +324,8 @@ /** * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 - * 优先级3 + * 0907需求变更:展示所有楼栋的所有楼层的评分 + * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody @@ -343,7 +344,7 @@ categoryLevelList.forEach(categoryLevel -> { categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); - //事件按楼层分组,计算 + List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); @@ -351,20 +352,38 @@ securityScoreDTO1.setArea(caseInfo.getArea()); String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); - List resultList = new ArrayList<>(); - Map collect = securityScoreDTOs.stream() - .collect(Collectors.groupingBy(SecurityScoreDTO::getPosition, Collectors.summingDouble(SecurityScoreDTO::getScore))); - collect.keySet().forEach(key ->{ - SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); - securityScoreDTO1.setArea(key); - securityScoreDTO1.setScore(collect.get(key)); - resultList.add(securityScoreDTO1); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + Map resultMap = new HashMap<>(); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); }); - return ResponseData.success(securityScoreDTOs); + //按楼层分组计算评分 +// collect.keySet().forEach(key -> { +// Map map = new HashMap<>(); +// List securityScoreDTOS = collect.get(key); +// //楼层-评分map +// Map collect1 = securityScoreDTOS.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getArea, Collectors.summingDouble(SecurityScoreDTO::getScore))); +// collect1.keySet().forEach(key1 -> { +// map.put(key1, 100 - collect1.get(key1)); +// }); +// String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); +// resultMap.put(dictValue, map); +// }); + return ResponseData.success(resultMap); } /** @@ -384,4 +403,25 @@ return ResponseData.success(list); } + /** + * 热力图:配置聚集事件的摄像头的3min内聚集事件发生(1/0) + */ + @PostMapping("/caseInfo/heatMap") + @ResponseBody + public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { + if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + heatMapDTO.setMinute(3); + } + List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); + Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); + HashMap resultMap = new HashMap<>(); + if(CollectionUtils.isEmpty(collect)){ + return ResponseData.success(); + } + collect.keySet().forEach(key -> { + resultMap.put(key, collect.get(key).size()); + }); + return ResponseData.success(resultMap); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java index f4f075c..da67d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -414,6 +414,8 @@ /** * 近30天/近一周安保人员到岗排行 + * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 + * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) */ 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 c71a15a..6d9e78e 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 @@ -164,10 +164,10 @@ //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-物业人员,添加到考勤表 + //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 hikService.propertyAttendanceHandle(event); } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { - //考勤分组处理-安保人员,添加到考勤表 + //考勤分组处理-安保人员,添加到考勤表,员工不走闸机 hikService.securityPersonnelHandle(event); } else { return; @@ -193,10 +193,13 @@ hikService.deviceOnlineHandle(event); } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 - hikService.visitorRegisterHandler(event); + hikService.visitorRegisterHandle(event); } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 - hikService.visitorCheckOutHandler(event); + hikService.visitorCheckOutHandle(event); + } else if (SecurityEventType.HIGH_ALTITUDE_PARABOLIC.equals(eventType)){ + //高空抛物事件处理 + caseInfo1 = hikService.highAltitudeParabolicHandle(event, caseInfo1); } if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java index 50aaa6f..fc6b103 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CaseInfoMapper.java @@ -63,4 +63,6 @@ List selectListByType(@Param("eventType") Number eventType); List selectDemobilizedCountByHour(@Param("eventType") Number eventType); + + List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java index 2555a09..f747192 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -34,4 +35,6 @@ List selectByType(@Param("devType") String devType); int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); + + int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java index fe5afc2..a554961 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/StaffInfoMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,4 +27,6 @@ List selectBatchCodes(@Param("list") List list); int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); + + int updateStaffInfoBatch(@Param("personList") List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml index 06ec0a8..581fbea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CaseInfoMapper.xml @@ -53,7 +53,9 @@ SELECT * FROM bus_case_info bci WHERE DATE_FORMAT(happen_time,'%Y-%m-%d') = CURRENT_DATE - AND bci.position = #{position} + + AND bci.position = #{position} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index bfd84b7..cddcf4f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml @@ -104,4 +104,12 @@ FROM bus_device_info WHERE ip = #{ip} + + + + update bus_device_info + set index_code = #{device.indexCode} + where ip = #{device.ip} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index b6a183a..072d9ca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml @@ -7,7 +7,8 @@ FROM bus_staff_info WHERE 1=1 - and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like concat('%',#{staffInfoRequest.keywords},'%')) + and (staff_code like concat('%',#{staffInfoRequest.keywords},'%') or staff_name like + concat('%',#{staffInfoRequest.keywords},'%')) and staff_type = #{staffInfoRequest.staffType} @@ -18,14 +19,18 @@ ORDER by create_time DESC - + + SELECT * + FROM bus_staff_info + WHERE staff_code = #{staffCode} + ORDER by create_time DESC + - SELECT * FROM bus_staff_info WHERE 1=1 @@ -38,7 +43,8 @@ ORDER by create_time DESC - SELECT * FROM bus_staff_info @@ -52,8 +58,18 @@ - UPDATE bus_staff_info - SET card_no = #{cardNo} - WHERE staff_code = #{staffCode} + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + + + + + + update bus_staff_info + set staff_face_id = #{person.faceId} + where staff_code = #{person.personId} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java new file mode 100644 index 0000000..a3bf376 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/AcsDeviceListDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class AcsDeviceListDTO { + //门禁点编号 + private String indexCode; + //ip + private String ip; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java new file mode 100644 index 0000000..0fad09e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/6 15:02 + */ +@Data +public class PersonListDTO { + private String personId; + private String faceId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java new file mode 100644 index 0000000..993f730 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/HeatMapDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 聚集事件热力图实体 + * @Author: wangpeng + * @Date: 2022/9/8 15:32 + */ +@Data +public class HeatMapDTO { + //入参 + private Integer minute; + //出参 + private Integer heatValue; +} 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 e5e613d..7a02cc4 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 @@ -50,4 +50,9 @@ String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; //以图搜图 String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; + //获取人员列表v2 + String PERSON_LIST = "/api/resource/v2/person/personList"; + //门禁设备列表 + String ACS_DEVICE_LIST = "/api/resource/v2/acsDevice/search"; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index c9b939d..7e519cf 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -46,6 +46,8 @@ private String deviceCode; @ExcelProperty("设备名称") private String devName; + //海康设备编号 + private String indexCode; //4个楼,字典值 @ExcelProperty("所在区域") private String position; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index 22f2075..b50b497 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -52,4 +53,6 @@ List selectRepairLogByCode(String devCode); int updateBatchGateGroupStatus(List deviceCodes, String status); + + int updateDeviceInfoBatch(List acsDeviceList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java index bcc3b5d..bc4ce9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikService.java @@ -26,9 +26,11 @@ void securityPersonnelHandle(JSONObject event); - void visitorRegisterHandler(JSONObject event); + void visitorRegisterHandle(JSONObject event); - void visitorCheckOutHandler(JSONObject event); + void visitorCheckOutHandle(JSONObject event); void deviceOnlineHandle(JSONObject event); + + CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java index 01870bd..5fd9e32 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; @@ -31,4 +32,6 @@ List staffInfoList(StaffInfoRequest staffInfoRequest); int saveCardInfo(StaffCardRequest staffCardRequest); + + int updateStaffInfoBatch(List personList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2f2b9e3..2608ba8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.dao.GateGroupMapper; import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; +import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -90,6 +91,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object addDeviceInfo(DeviceInfo deviceInfo) { DeviceInfo device = deviceInfoMapper.getDeviceInfo(deviceInfo.getDevCode()); if(!Objects.isNull(device)){ @@ -102,6 +104,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object updateDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.updateById(deviceInfo) > 0){ return ResponseData.success(); @@ -110,6 +113,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteDeviceInfo(DeviceInfo deviceInfo) { if(deviceInfoMapper.deleteById(deviceInfo.getId()) > 0){ return ResponseData.success(); @@ -118,6 +122,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteBatchDeviceInfo(List ids) { if(deviceInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); @@ -126,6 +131,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); @@ -204,11 +210,13 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int addDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.insert(deviceRepairLog); } @Override + @Transactional(rollbackFor = Exception.class) public int deleteDevicePairLog(DeviceRepairLog deviceRepairLog) { return deviceRepairLogMapper.deleteById(deviceRepairLog.getId()); } @@ -233,7 +241,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object addGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroupDb = gateGroupMapper.getGateGroupByName(gateGroupDTO.getGroupName()); if(!Objects.isNull(gateGroupDb)){ @@ -261,7 +269,7 @@ } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Object updateGateGroupDTO(GateGroupDTO gateGroupDTO) { GateGroup gateGroup = new GateGroup(); BeanUtils.copyProperties(gateGroupDTO, gateGroup); @@ -289,6 +297,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Object deleteGateGroupDTO(GateGroupDTO gateGroupDTO) { int i = gateGroupMapper.deleteById(gateGroupDTO.getId()); Map columnMap = new HashMap<>(); @@ -326,9 +335,16 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int updateBatchGateGroupStatus(List deviceCodes, String status) { return deviceInfoMapper.updateStatusBatchByCodes(deviceCodes, status); } + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDeviceInfoBatch(List acsDeviceList) { + return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java index dbad48f..ff60402 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikServiceImpl.java @@ -62,6 +62,7 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -86,6 +87,7 @@ log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -110,6 +112,7 @@ log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -135,6 +138,7 @@ log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -146,7 +150,7 @@ List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ - log.error("海康回调,更新监控点离线线状态失败!"); + log.error("海康回调,更新监控点离线状态失败!"); return null; } return caseInfo; @@ -156,6 +160,10 @@ public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + return; + } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); @@ -180,6 +188,7 @@ log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); return caseInfo; } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 @@ -211,6 +220,32 @@ } @Override + public CaseInfo highAltitudeParabolicHandle(JSONObject event, CaseInfo caseInfo) { + //加入到安防事件 + String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 + String happenTimeISO = String.valueOf(event.get("happenTime")); + DateTime parse = DateUtil.parse(happenTimeISO); + String happenTime = DateUtil.formatDateTime(parse); + caseInfo.setHappenTime(happenTime); //发生时间 + // TODO: 2022/7/28 字典值选择 + List dict = dictService.findInDictByCode(SecurityEventDict.CASE_STATUS); + caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } + caseInfo.setIndexCode(srcIndex); + caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code + caseInfo.setDevName(deviceInfo.getDevName()); //设备名 + caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 + caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + return caseInfo; + } + + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -301,7 +336,7 @@ } @Override - public void visitorRegisterHandler(JSONObject event) { + public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("startTime")); @@ -332,7 +367,7 @@ } @Override - public void visitorCheckOutHandler(JSONObject event) { + public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); String endTime = DateUtil.formatDateTime(parse); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java index d19dceb..c2714f5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInfoServiceImpl.java @@ -9,6 +9,7 @@ import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; +import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; @@ -103,6 +104,7 @@ JSONObject data = (JSONObject)resultJson.get("data"); String faceId = data.getString("faceId"); staffInfo.setStaffFaceId(faceId); + staffInfo.setPicture(""); if(staffInfoMapper.insert(staffInfo) > 0){ return ResponseData.success(); } @@ -284,4 +286,10 @@ } return 1; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateStaffInfoBatch(List personList) { + return staffInfoMapper.updateStaffInfoBatch(personList); + } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 12786de..26e049d 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -60,6 +60,12 @@ org.springframework.boot spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-devtools + runtime + com.casic @@ -164,6 +170,15 @@ maven-war-plugin ${maven.war.plugin.version} + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + diff --git a/casic-web/src/main/build/bin/teststart.sh b/casic-web/src/main/build/bin/teststart.sh index d737e70..03e8d4a 100644 --- a/casic-web/src/main/build/bin/teststart.sh +++ b/casic-web/src/main/build/bin/teststart.sh @@ -1 +1 @@ -nohup java -jar ./lib/${project.build.finalName}.jar > /dev/null 2>&1 & \ No newline at end of file +nohup java -jar ./lib/casic-web-2.0.0.jar > /dev/null 2>&1 & \ No newline at end of file